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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow