Swift Language
Design Patterns - Structural
Recherche…
Introduction
Les modèles de conception sont des solutions générales aux problèmes fréquents dans le développement de logiciels. Les éléments suivants sont des modèles de meilleures pratiques normalisées en matière de structuration et de conception du code, ainsi que des exemples de contextes communs dans lesquels ces modèles de conception seraient appropriés.
Les modèles de conception structurelle se concentrent sur la composition des classes et des objets pour créer des interfaces et obtenir de meilleures fonctionnalités.
Adaptateur
Les adaptateurs permettent de convertir l'interface d'une classe donnée, appelée Adaptee , en une autre interface, appelée Target . Les opérations sur la cible sont appelées par un client et ces opérations sont adaptées par l'adaptateur et transmises à l'adaptee.
Dans Swift, les adaptateurs peuvent souvent être formés à l'aide de protocoles. Dans l'exemple suivant, un client pouvant communiquer avec la cible a la possibilité d'exécuter des fonctions de la classe Adaptee en utilisant un adaptateur.
// The functionality to which a Client has no direct access
class Adaptee {
func foo() {
// ...
}
}
// Target's functionality, to which a Client does have direct access
protocol TargetFunctionality {
func fooBar() {}
}
// Adapter used to pass the request on the Target to a request on the Adaptee
extension Adaptee: TargetFunctionality {
func fooBar() {
foo()
}
}
Exemple de flux d'un adaptateur unidirectionnel: Client -> Target -> Adapter -> Adaptee
Les adaptateurs peuvent également être bidirectionnels, appelés adaptateurs bidirectionnels . Un adaptateur bidirectionnel peut être utile lorsque deux clients différents doivent afficher un objet différemment.
Façade
Une façade fournit une interface unifiée et de haut niveau aux interfaces de sous-système. Cela permet un accès plus simple et plus sûr aux installations plus générales d'un sous-système.
Voici un exemple de façade utilisé pour définir et récupérer des objets dans UserDefaults.
enum Defaults {
static func set(_ object: Any, forKey defaultName: String) {
let defaults: UserDefaults = UserDefaults.standard
defaults.set(object, forKey:defaultName)
defaults.synchronize()
}
static func object(forKey key: String) -> AnyObject! {
let defaults: UserDefaults = UserDefaults.standard
return defaults.object(forKey: key) as AnyObject!
}
}
L'utilisation pourrait ressembler à ceci:
Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")
Les complexités liées à l'accès à l'instance partagée et à la synchronisation des UserDefaults sont masquées pour le client, et cette interface est accessible depuis n'importe où dans le programme.