Swift Language
Wzory projektowe - strukturalne
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.