2011-03-29 16 views
25

Tengo algunas preguntas sobre el patrón de adaptador. Entiendo que el adaptador de clase hereda del adaptador mientras que el adaptador del objeto tiene el adaptado como un objeto en lugar de heredar de él.Patrón de adaptador: adaptador de clase frente a adaptador de objeto

¿Cuándo utilizaría un adaptador de clase sobre un adaptador de objeto y viceversa? Además, ¿cuáles son las ventajas y desventajas de usar el adaptador de clase y las compensaciones del adaptador de objeto?

Respuesta

22

Veo una ventaja para el adaptador de objeto, dependiendo de su lenguaje de programación: si este último no es compatible con herencia múltiple (como Java, por ejemplo), y quiere adaptar varias adaptaciones en una sola toma, ' Estaré obligado a usar un adaptador de objeto.

Otro punto para el adaptador de objetos es que puede hacer que el adaptador envuelto viva su vida como lo desee (instanciación especialmente, siempre que crea una instancia de su adaptador DESPUÉS de su adaptador), sin tener que especificar todos los parámetros (la parte de su adaptador) Y la parte para su adaptador debido a la herencia) cuando crea una instancia de su adaptador. Este enfoque parece más flexible para mí.

11

Class Adapter es normal antiguo Inheritance, disponible en todos los lenguajes orientados a objetos, mientras que Object Adapter es una forma clásica de Adapter Design Pattern.

El mayor beneficio de Object Adapter comparación con Class Adapter (y por lo tanto Inheritance) es loose coupling del cliente y adaptée.

12

prefieren utilizar la composición, sobre la herencia

En primer lugar decir que tenemos un usuario;

public interface IUser 
{ 
    public String Name { get; } 
    public String Surname { get; } 
} 

public class User : IUser 
{ 
    public User(String name, String surname) 
    { 
     this.Name = name; 
     this.Surname = surname; 
    } 

    public String Name { get; private set; } 
    public String Surname { get; private set; } 
} 

Ahora, imaginemos que por cualquier razón, usted está obligado a tener un adaptador para la clase de usuario, entonces tenemos dos aproaches, por herencia, o compuesto;

//Inheritance 
public class UserAdapter1 : User 
{ 
    public String CompleteName { get { return base.Name + " " + base.Surname } } 
} 

//Composition 
public class UserAdapter2 
{ 
    private IUser user; 

    public UserAdapter2(IUser user) 
    { 
     this.user = user; 
    } 

    public String CompleteName { get { return this.user.Name + " " + this.user.Surname; } } 
} 

usted está totalmente bien, pero sólo si el sistema no crecen ... Imagínese que usted está obligado a implementar una clase de superusuario, con el fin de hacer frente a un nuevo requisito;

public class SuperUser : IUser 
{ 
    public SuperUser(String name, String surname) 
    { 
     this.Name = name; 
     this.Surname = surname; 
    } 

    public String Name { get; private set; } 
    public String Surname { get; private set; } 

    public Int32 SupernessLevel { get { return this.Name.Length * 100; } } 
} 

Mediante el uso de la herencia que no sería capaz de volver a utilizar su clase adaptador, echar a perder su código (como su tendrían que aplicar otro adaptador, heredando de superusuario que haría ECXATLY lo mismo de la otra clase !!!) ... El uso de la interfaz se trata de uncopling, esa es la razón principal por la que tengo 99% de probabilidad de usarlos, por supuesto, si la elección depende de mí.

0
  • adaptadores de clase adapta adaptée a Target, comprometiéndose a una clase específica adaptador no funcionará cuando queremos adaptar una clase y sus subclases.
  • adaptadores de objetos permite a una sola obra adaptador con muchas Adaptees (el adaptado y toda jerarquía adaptees)
4

Un adaptador de clase utiliza herencia múltiple para adaptar una interfaz a otra: (dependiendo de su lenguaje de programación: Java & C# no soporta la herencia múltiple) enter image description here

Un adaptador objeto depende de la composición objeto: enter image description here

Images Fuente: Modelo de Diseño (Elementos de software reutilizables orientada a objetos) de libros

0

Además de what renatoargh has mentioned in his answer Me gustaría añadir una ventaja del adaptador de la clase.

En adaptador de clase que fácilmente puede reemplazar el comportamiento de la adaptée si es necesario dado que está subclassing ella. Y es más difícil en el adaptador de objetos.

Sin embargo, las ventajas del adaptador de objeto generalmente superan esta pequeña ventaja del adaptador de clase.

Cuestiones relacionadas