Swift Language
Шаблоны проектирования - структурные
Поиск…
Вступление
Шаблоны проектирования - это общие решения проблем, которые часто возникают при разработке программного обеспечения. Ниже приведены шаблоны стандартизованных передовых методов структурирования и проектирования кода, а также примеры общих контекстов, в которых эти шаблоны проектирования были бы подходящими.
Структурные шаблоны проектирования сосредоточены на составлении классов и объектов для создания интерфейсов и обеспечения большей функциональности.
адаптер
Адаптеры используются для преобразования интерфейса данного класса, известного как 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 скрыты от клиента, и к этому интерфейсу можно получить доступ из любой точки программы.