Swift Language
Design Patterns - Strukturelle
Suche…
Einführung
Entwurfsmuster sind allgemeine Lösungen für Probleme, die häufig in der Softwareentwicklung auftreten. Im Folgenden finden Sie Mustervorlagen für standardisierte Best Practices beim Strukturieren und Entwerfen von Code sowie Beispiele für gängige Kontexte, in denen diese Entwurfsmuster geeignet wären.
Strukturelle Entwurfsmuster konzentrieren sich auf die Zusammenstellung von Klassen und Objekten, um Schnittstellen zu erstellen und eine größere Funktionalität zu erreichen.
Adapter
Adapter werden verwendet, um die Schnittstelle einer bestimmten Klasse, die als Adaptee bezeichnet wird , in eine andere Schnittstelle umzuwandeln , die als Target bezeichnet wird . Operationen auf dem Ziel werden von einem Client aufgerufen, und diese Operationen werden vom Adapter angepasst und an den Adaptee weitergeleitet.
In Swift können Adapter häufig durch Verwendung von Protokollen gebildet werden. Im folgenden Beispiel wird einem Client, der mit dem Ziel kommunizieren kann, die Möglichkeit gegeben, Funktionen der Klasse Adaptee mithilfe eines Adapters auszuführen.
// 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()
}
}
Beispiel für einen One-Way-Adapter: Client -> Target -> Adapter -> Adaptee
Adapter können auch bidirektional sein, und diese werden als Zweiwegeadapter bezeichnet . Ein Zwei-Wege-Adapter kann nützlich sein, wenn zwei verschiedene Clients ein Objekt unterschiedlich anzeigen müssen.
Fassade
Eine Fassade bietet eine einheitliche, übergeordnete Schnittstelle zu den Subsystemschnittstellen. Dies ermöglicht einen einfacheren und sichereren Zugriff auf die allgemeineren Einrichtungen eines Subsystems.
Das folgende Beispiel zeigt eine Fassade, die zum Festlegen und Abrufen von Objekten in UserDefaults verwendet wird.
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!
}
}
Die Verwendung könnte wie folgt aussehen.
Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")
Die Komplexität des Zugriffs auf die gemeinsam genutzte Instanz und die Synchronisierung von UserDefaults werden vom Client ausgeblendet. Auf diese Schnittstelle kann von überall im Programm zugegriffen werden.