Szukaj…


Wprowadzenie

Wzorce projektowe są ogólnymi rozwiązaniami problemów, które często występują podczas tworzenia oprogramowania. Poniżej znajdują się szablony znormalizowanych najlepszych praktyk w zakresie strukturyzacji i projektowania kodu, a także przykłady typowych kontekstów, w których te wzorce projektowe byłyby odpowiednie.

Strukturalne wzorce projektowe koncentrują się na składaniu klas i obiektów w celu tworzenia interfejsów i osiągania większej funkcjonalności.

Adapter

Adaptery służą do konwersji interfejsu danej klasy, znanego jako Adaptee , na inny interfejs o nazwie Target . Operacje na urządzeniu docelowym są wywoływane przez klienta , a operacje te są dostosowywane przez adapter i przekazywane do osoby uprawnionej.

W Swift adaptery można często tworzyć przy użyciu protokołów. W poniższym przykładzie klientowi, który może komunikować się z obiektem docelowym, można wykonywać funkcje klasy Adaptee za pomocą adaptera.

// 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()
    }
}

Przykładowy przepływ jednokierunkowego adaptera: Client -> Target -> Adapter -> Adaptee

Adaptery mogą być również dwukierunkowe i są znane jako adaptery dwukierunkowe . Dwukierunkowy adapter może być przydatny, gdy dwóch różnych klientów musi inaczej oglądać obiekt.

Fasada

Fasada zapewnia zunifikowany interfejs wysokiego poziomu do interfejsów podsystemów. Pozwala to na łatwiejszy i bezpieczniejszy dostęp do bardziej ogólnych udogodnień podsystemu.

Poniżej znajduje się przykład fasady używanej do ustawiania i wyszukiwania obiektów w UserDefault.

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!
    }

}

Użycie może wyglądać następująco.

Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")

Złożoność dostępu do współużytkowanej instancji i synchronizacji UserDefault jest ukryta przed klientem, a do tego interfejsu można uzyskać dostęp z dowolnego miejsca w programie.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow