strategy pattern oop design-patterns adapter software-design

oop - pattern - Patrón del adaptador: Adaptador de clase vs Adaptador de objetos



proxy pattern (6)

Tengo algunas preguntas sobre el patrón del adaptador. Entiendo que el adaptador de clase se hereda del adaptee mientras que el adaptador de objeto tiene el adaptee como un objeto en lugar de heredarlo de él.

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


Además de lo que ha mencionado renatoargh en su respuesta, me gustaría agregar una ventaja de adaptador de clase .

En el adaptador de clase, puede anular fácilmente el comportamiento del adaptee si lo necesita porque solo lo está subclasificando . Y es más difícil en el adaptador de objetos.

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


Prefiero usar composición, sobre herencia.

Primero digamos 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, imagine que por cualquier razón, debe tener un adaptador para la clase de usuario, entonces tenemos dos enfoques, por herencia o por 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; } } }

Estás totalmente bien, pero solo si el sistema no crece ... Imagina que estás obligado a implementar una clase SuperUser, para lidiar con 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; } } }

Al usar la herencia, no podrá reutilizar su clase de adaptador, desordenando su código (¡como tendría que implementar otro adaptador, heredando de SuperUser que haría ECXATAMENTE lo mismo que en la otra clase!) .. El uso de la interfaz tiene que ver con descifrar, esa es la razón principal por la que tengo un 99% de probabilidades de usarlos, por supuesto, si la elección depende de mí.


Puedo ver una ventaja para el adaptador de objetos, dependiendo de su lenguaje de programación: si este último no admite herencia múltiple (como Java, por ejemplo), y desea adaptar varios adaptados de una sola vez, estará obligado a utilizar un adaptador de objetos.

Otro punto para el adaptador de objetos es que puede hacer que el adaptador adaptado viva su vida como se desea (en particular, la creación de instancias de su adaptador DESPUÉS de su adaptador), sin tener que especificar todos los parámetros (la parte de su adaptador Y la parte de su adaptador debido a la herencia) cuando crea una instancia de su adaptador. Este enfoque me parece más flexible.


Un adaptador de clase usa herencia múltiple para adaptar una interfaz a otra: (dependiendo de su lenguaje de programación: Java y C # no admiten herencia múltiple)

Un adaptador de objeto depende de la composición del objeto:

Fuente de las imágenes: libro de Patrón de diseño (Elementos de software orientado a objetos reutilizables)


Class Adapter es una Inheritance simple, disponible en todos los lenguajes orientados a objetos, mientras que Object Adapter es una forma clásica de un Patrón de Diseño de Adaptadores .

El mayor beneficio del Object Adapter de Object Adapter comparación con el Class Adapter (y, por lo tanto, la Inheritance ) es el acoplamiento suelto del cliente y el adaptador.


  • los adaptadores de clase adaptan Adaptee a Target comprometiéndose con una clase de Adaptador específica no funcionará cuando queremos adaptar una clase y sus subclases.
  • los adaptadores de objetos permiten que un solo adaptador funcione con muchos Adaptees (el Adaptee y la jerarquía de todos los adaptees)