Javascript: Decoradores

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?

  • 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