Nov 19 2008
Patrón Decorador - Definición, diagramas e implementación {
El patrón decorador, (decorator pattern), añade nuevas responsabilidades a un objeto dinamicamente, ofreciendo una alternativa flexible a la herencia.
En otras palabras, es una forma de agregar funcionalidades a una clase, extendiéndola pero sin recurrir a la herencia. ¿Por qué no heredar? Bueno, tal vez no desees dar acceso a toda la clase primaria y entonces sólo se daría acceso a lo necesario.
Veamos un ejemplo simple, tenemos las siguientes clases:
- Persona (ID, Nombre, Apellido y Fecha de Nacimiento)
- Usuario (ID, Nombre, Apellido, Usuario, Passwd)
- Cliente (ID, Nombre, Apellido, Teléfono, Email)
- Cliente VIP (ID, Nombre, Apellido, Teléfono, Email, Nro de Cuenta, Límite de Crédito)
Cómo vemos todos tienen campos comunes a Persona, pero no tienen todos los campos de la clase Persona, por eso no podemos heredar, así es que podremos implementar decoradores para la clase Persona, tendremos los decoradores Usuario, Cliente y Cliente VIP. (Ver figura 1).
Pero si analizamos lo que hemos diseñado hasta el momento podremos observar que Cliente VIP podría llegar a convertirse en un decorador de Cliente, que como recordamos es un decorador de Persona, de esa manera no tendremos que reescribir la lógica detrás de los atributos Teléfono e Email. (Ver figura 2).
La pregunta es cómo decorar una clase, pues a grandes rasgos podríamos decir que se trata de tener una variable privada de la clase a decorar, escribir los métodos o atributos que se deseen publicar de la clase a decorar y luego agregar las decoraciones en nuestra nueva clase, entendiendo por decoraciones los nuevos métodos y/o atributos.
Por último veamos el código correspondiente a nuestras clases.
class Persona { private int ID; private String Nombre; private String Apellido; private Date FechaNac; public int getID() { return ID; } public String getNombre() { return Nombre; } public String getApellido() { return Apellido; } public Date getFechaNac() { return FechaNac; } } class Usuario { private Persona mPersona; private String Usuario; private String Passwd; public int getID() { return mPersona.getID(); } public String getNombre() { return mPersona.getNombre(); } public String getApellido() { return mPersona.getApellido(); } public String getUsuario() { return Usuario; } public String getPasswd() { return Passwd; } } class Cliente { private Persona mPersona; private String Telefono; private String Email; public int getID() { return mPersona.getID(); } public String getNombre() { return mPersona.getNombre(); } public String getApellido() { return mPersona.getApellido(); } public String getTelefono() { return Telefono; } public String getEmail() { return Email; } } class Cliente_VIP { private Cliente mCliente; private String NroCuenta; private Double LimiteCredito; public int getID() { return mCliente.getID(); } public String getNombre() { return mCliente.getNombre(); } public String getApellido() { return mCliente.getApellido(); } public String getTelefono() { return mCliente.getTelefono(); } public String getEmail() { return mCliente.getEmail(); } public String getNroCuenta() { return NroCuenta; } public Double getLimiteCredito() { return LimiteCredito; } }
}