2009-01-16 17 views

Respuesta

3

Usted puede leer this article sobre el adaptador/patrón enchufable:

Tabla de contenidos en este artículo:

* 1 Design Patterns 
* 2 Intent of Adapter 
* 3 Motivation 
* 4 Structure 
* 5 Applicability 
* 6 Consequences 
* 7 Implementation 
     o 7.1 Known Uses and Sample Code 
     o 7.2 Related Patterns 
* 8 Conclusions 
* 9 Appendix 
     o 9.1 References 
     o 9.2 Glossary 

Cita:

Smalltalk introdujo el concepto de un "adaptador enchufable "para describir clases con una función de interfaz de adaptación. Este concepto interesante permite para las clases que se introducirán en los sistemas existentes que podrían esperar diferentes interfaces para la clase . Esta técnica puede ayudar a promover la reutilización clase a través de módulos e incluso proyectos.

Aquí hay un pequeño ejemplo:

Tenemos dos clases - Foo & Boo que da salida a un trozo de cuerda a la consola. La clase de adaptador puede adaptar métodos de ambas clases para proporcionar la interfaz (SaySomething) requerida por el cliente. Tenga en cuenta que no hay dependencia en el nombre de la interfaz; podemos adaptar fácilmente los métodos SayHey y Bark.

class Foo 
{ 
    public static void SayHey() { Console.WriteLine("Hey!"); } 
} 

class Boo 
{ 
    public static void Bark() { Console.WriteLine("Woof!"); } 
} 

class Adapter 
{ 
    public Action SaySomething { get; private set;} // "pluggable" adapter 

    public Adapter(Action saySomethingAction) 
    { 
     SaySomething = saySomethingAction; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     (new Adapter(Foo.SayHey)).SaySomething(); 
     (new Adapter(Boo.Bark)).SaySomething(); 
    } 
} 
+0

hice referencia dicho artículo. Supongo que también buscas eso con Google. Pero no explica claramente sobre el adaptador enchufable. Se refiere al libro de GoF que he leído. –

+0

El enlace al artículo ahora está roto. – miguelbgouveia

13

Por lo que entendí de una lectura rápida de los resultados de Google, un adaptador enchufable es un adaptador que no está codificado con fuerza contra una adaptée específica. En la superficie (la propia interfaz del adaptador), es todo lo mismo, pero se puede adaptar a diferentes adaptaciones con diferentes interfaces. He encontrado this thread bastante explicativo:

Básicamente, se le permite poner en un adaptador cuando el adaptado protocolo (receptor) no se conoce en tiempo de compilación mediante el uso de la reflexión. Cuando se crea la instancia adaptador, se le pasa el nombre del método de el adaptado para llamar, y también los metadatos que es necesaria para traducir tipos de entrada. Cuando el adaptador recibe una llamada al método de la interfaz de destino , se utiliza la reflexión para llamar al método correspondiente especificado en el adaptado.

Y this:

La responsabilidad principal del Visor es poblar un widget de un modelo de dominio sin hacer ninguna suposición sobre dominio de sí mismo. JFace espectador utiliza la Delegar Objetos mecanismo de adapter enchufable para implementar el requisito anterior.

Facehugger in action

pensar en él como un Facehugger de Alien; cuando abraza una cara, todo lo que ves es la espalda fangosa de la facehugger. Puede empujarlo con un palo e intentar levantar sus brazos (la interfaz del adaptador). Pero básicamente puede abrazar a cualquier humano (el adaptado), independientemente de las características de la cara. Tal vez lo estoy presionando un poco, pero, oye, amo a Alien.

+1

¡Gran analogía! :) – cschol

0

Una característica distintiva del adaptador enchufable es que el método invocado por el cliente y el método existente en la interfaz pueden ser diferentes.

interface Ilegacy 
    { 
     float calculate(int a, int b); 
    } 
    class Legacy : Ilegacy 
    { 
     public float calculate(int a, int b) 
     { 
      return a * b; 
     } 
    } 
    class Adapter 
    { 
     public Func<int, int, float> legacyCalculator; 
     public Adapter() 
     { 
      this.legacyCalculator = new Legacy().calculate; 
     } 
    } 
    class Client 
    { 
     static void Main() 
     { 
      float result = new Adapter().legacyCalculator(5, 6); 
     } 
    } 

Normalmente, esto puede acheived con el uso de delegado, o Func Acción en C#

Cuestiones relacionadas