Поиск…


Вступление

Шаблоны проектирования - это общие решения проблем, которые часто возникают при разработке программного обеспечения. Ниже приведены шаблоны стандартизованных передовых методов структурирования и проектирования кода, а также примеры общих контекстов, в которых эти шаблоны проектирования были бы подходящими.

Структурные шаблоны проектирования сосредоточены на составлении классов и объектов для создания интерфейсов и обеспечения большей функциональности.

адаптер

Адаптеры используются для преобразования интерфейса данного класса, известного как Adaptee , в другой интерфейс, называемый Target . Операции над объектом вызываются клиентом , и эти операции адаптируются адаптером и передаются в Adaptee.

В Swift адаптеры часто могут формироваться с использованием протоколов. В следующем примере клиент, способный связываться с Target, получает возможность выполнять функции класса Adaptee с помощью адаптера.

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

Пример потока одностороннего адаптера: Client -> Target -> Adapter -> Adaptee

Адаптеры также могут быть двунаправленными, и они известны как двухсторонние адаптеры . Двухсторонний адаптер может быть полезен, когда два разных клиента должны просматривать объект по-разному.

Фасад

Фасад обеспечивает унифицированный интерфейс высокого уровня для интерфейсов подсистем. Это обеспечивает более простой и безопасный доступ к более общим функциям подсистемы.

Ниже приведен пример Фасад, используемый для установки и извлечения объектов в UserDefaults.

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

}

Использование может выглядеть следующим образом.

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

Сложности доступа к общему экземпляру и синхронизации UserDefaults скрыты от клиента, и к этому интерфейсу можно получить доступ из любой точки программы.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow