Patrones de diseño: Adapter
Este patrón permite adaptar una clase a una interfaz ya creada.
Puede sernos útil sobre todo cuando tengamos código heredado que no implemente por si solo una interfaz dada.
Veamos su estructura:
- Cliente: Clase que necesita utilizar el código de Adaptee a través de una interfaz dada.
- ITarget: Interfaz que queremos usar.
- Adaptee: Clase que contiene el código que queremos utilizar.
- Adapter: Implementa ITarget, obtieniendo de Adaptee las funcionalidades que deseamos.
Un diagrama de la wikipedia:
Implementación
ITarget
public interface IClient { /// <summary> /// Obtenemos una lista de direcciones por id del cliente /// </summary> /// <param name="id">pk del cliente</param> /// <returns>lista de direcciones de un cliente</returns> List<string> GetAddresses(int id); }
Adaptee
public class ContactAdaptee { /// <summary> /// Obtenemos una dirección por id de contacto /// </summary> /// <param name="id">pk del contacto</param> /// <returns>dirección de un contacto</returns> public string GetAddress(int id) { // creamos la direccÃón (que cogerÃamos de base de datos) string address = "Av. Lexington 63, New York"; return address; } }
Adapter
public class ContactAdapter: IClient { /// <summary> /// Obtenemos una lista de direcciones por id de contacto /// </summary> /// <param name="id">pk del contacto</param> /// <returns>lista de direcciones de un contacto</returns> public List<string> GetAddresses(int id) { ContactAdaptee adaptee = new ContactAdaptee(); return new List<string> { adaptee.GetAddress(id) }; } }
o bien
public class ContactAdapter: ContactAdaptee, IClient { /// <summary> /// Obtenemos una lista de direcciones por id de contacto /// </summary> /// <param name="id">pk del contacto</param> /// <returns>lista de direcciones de un contacto</returns> public List<string> GetAddresses(int id) { return new List<string>{base.GetAddress(id)}; } }
y finalmente el Client
class Program { static void Main(string[] args) { // inicializamos el adapter IClient contactAdapter = new ContactAdapter(); // obtenemos las direcciones del contacto con pk 1 List<string> addresses = contactAdapter.GetAddresses(1); } }
Y eso es todo, gracias a este patrón podemos reutilizar una clase adaptándola a una interfaz de forma muy sencilla.
Enlaces
http://es.wikipedia.org/wiki/Adapter_(patr%C3%B3n_de_dise%C3%B1o)
http://www.dofactory.com/net/adapter-design-pattern
http://www.codeproject.com/Articles/774259/Adapter-Design-Pattern-Csharp











