Swift Language
Ontwerppatronen - Structureel
Zoeken…
Invoering
Ontwerppatronen zijn algemene oplossingen voor problemen die vaak voorkomen bij softwareontwikkeling. Hierna volgen sjablonen van gestandaardiseerde best practices bij het structureren en ontwerpen van code, evenals voorbeelden van gemeenschappelijke contexten waarin deze ontwerppatronen geschikt zijn.
Structurele ontwerppatronen zijn gericht op de samenstelling van klassen en objecten om interfaces te creëren en meer functionaliteit te bereiken.
Adapter
Adapters worden gebruikt om de interface van een bepaalde klasse, bekend als een Adaptee , om te zetten in een andere interface, de Target genoemd . Bewerkingen op het doel worden door een klant opgeroepen en die bewerkingen worden door de adapter aangepast en doorgegeven aan de geadresseerde.
In Swift kunnen adapters vaak worden gevormd door het gebruik van protocollen. In het volgende voorbeeld krijgt een klant die met het doel kan communiceren, de mogelijkheid om functies van de klasse Adaptee uit te voeren door middel van een adapter.
// 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()
}
}
Voorbeeldstroom van een eenrichtingsadapter: Client -> Target -> Adapter -> Adaptee
Adapters kunnen ook bidirectioneel zijn en deze staan bekend als bidirectionele adapters . Een tweerichtingsadapter kan handig zijn wanneer twee verschillende clients een object anders moeten bekijken.
Facade
Een gevel biedt een uniforme interface op hoog niveau met subsysteeminterfaces. Dit zorgt voor eenvoudigere, veiligere toegang tot de meer algemene voorzieningen van een subsysteem.
Het volgende is een voorbeeld van een gevel die wordt gebruikt om objecten in UserDefaults in te stellen en op te halen.
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!
}
}
Het gebruik kan er als volgt uitzien.
Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")
De complexiteit van toegang tot de gedeelde instantie en het synchroniseren van UserDefaults zijn verborgen voor de client en deze interface is overal in het programma toegankelijk.