Un decorador es un objeto que añade funcionalidades a otro objeto de manera dinámica. Puede utilizarse para ampliar el comportamiento de un objeto sin tener que agregar funcionalidades a la clase que instancia. En lenguajes como Javascript es muy fácil implementarlos.
¿Cuándo se suelen utilizar?
¿Cuándo se suelen utilizar?
- Cuando quieres agregar funcionalidades a un objeto sin tocar su clase (subclassing o herencia).
- Cuando quieres eliminar esa funcionalidad de manera posterior (undecorate).
- Cuando quieres evitar que la clase de tu objeto crezca de manera descontrolada y se se convierta en algo inmanejable (class explosion).
Ventajas:
- Más flexible que la herencia.
- Evitas construir un rascacielos de herencias.
Desventajas:
- Un decorador y su componente son iguales.
- Multitud de pequeños objetos.
Vamos a la parte práctica, en primer lugar definimos el decorador:
Validator.decorators = {};
Validator.decorators.hasName = {
validate: function(form) {
// Verificamos si nombre tiene valor...
// Si no hay nombre...
this.errors.push('Falta el nombre');
}
};
Validator.decorators.hasAge = {
validate: function(form) {
// Verificamos si edad tiene valor...
// Si no hay edad...
this.errors.push('Falta la edad');
}
};
A continuación implementamos Validator:
Validator.prototype.validate = function(form) {
var i,
max,
name;
this.form = form;
max = this.decoratorsList.length;
for (i = 0; i < max; i++) {
name = this.decoratorsList[i];
Validator.decorators[name].validate.call(this, form);
};
};
Y por último instanciamos Validator, la enriquecemos con nuestro decorador y ejecutamos el método validate:
var validator = new Validator();
validator.decorate('hasName');
validator.decorate('hasAge');
validator.decorate('hasZipCode');
validator.validate({}); // El valor de ejemplo está vacío
console.log(validator.errors);
Como podréis ver hemos podido ejecutar el contenido de Validator añadiéndole nuevas funcionalidades sin tener que modificar la clase que lo instancia.
Cómo veis es muy sencillo y un muy práctico de utilizar. En un próximo post ampliaré más información sobre decoradores.
Espero que os sea de utilidad.
Comentarios