Buscar..


Introducción

Los patrones de diseño son soluciones generales a problemas que ocurren con frecuencia en el desarrollo de software. Las siguientes son plantillas de mejores prácticas estandarizadas para estructurar y diseñar códigos, así como ejemplos de contextos comunes en los que estos patrones de diseño serían apropiados.

Los patrones de diseño estructural se centran en la composición de clases y objetos para crear interfaces y lograr una mayor funcionalidad.

Adaptador

Los adaptadores se utilizan para convertir la interfaz de una clase determinada, conocida como Adaptee , en otra interfaz, llamada Destino . Las operaciones en el destino son llamadas por un cliente , y esas operaciones son adaptadas por el adaptador y pasadas al Adaptee.

En Swift, los adaptadores a menudo pueden formarse mediante el uso de protocolos. En el siguiente ejemplo, un Cliente capaz de comunicarse con el Destino cuenta con la capacidad de realizar funciones de la clase Adaptee mediante el uso de un adaptador.

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

Ejemplo de flujo de un adaptador unidireccional: Client -> Target -> Adapter -> Adaptee

Los adaptadores también pueden ser bidireccionales, y estos se conocen como adaptadores de dos vías . Un adaptador bidireccional puede ser útil cuando dos clientes diferentes necesitan ver un objeto de manera diferente.

Fachada

Una fachada proporciona una interfaz unificada de alto nivel para las interfaces del subsistema. Esto permite un acceso más sencillo y seguro a las instalaciones más generales de un subsistema.

El siguiente es un ejemplo de una fachada utilizada para establecer y recuperar objetos en 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!
    }

}

El uso podría parecerse a lo siguiente.

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

Las complejidades de acceder a la instancia compartida y sincronizar los UserDefaults están ocultos para el cliente, y se puede acceder a esta interfaz desde cualquier parte del programa.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow