Delegacion

1 Sinopsis

Permite dar a una clase comportamiento adicional sin tener que recurrir a tecnicas de herencia.

2 Contexto

Supongase que la informacion sobre una Persona se tiene que modelar. Dicha Persona debe interactuar de distintas maneras como parte de un sistema de informacion que crecera en funciones en el futuro. Se puede proponer la solucion via herencia, en la cual, se agrega una nueva clase, por cada ROL o funcion nueva que debe adoptar la persona.

3 Solucion

Consiste en que la clase tenga referencias a clases de los modulos que proporcionan las funcionalidades nuevas.

4 Consecuencias

Es posible dar comportamiento adicional a una clase, sin tener que usar herencia. Este patron, llevado a su maxima capacidad, puede permitir agregar comportamiento sin tener que recodificar el modulo.

5 Ejemplo

Se necesita representar en un sistema de computo el concepto de una Persona. La persona debe dar la capacidad de tratarlo como un Alumno y un Empleado de una institucion educativa. La clase Empleado es la siguiente:


public class Empleado  {
    ....
}
See the complete code for Empleado here.

La clase permite almacenar el numero de empleado, proporcionando metodos para accesar la propiedad.

  private int _numero;  
  public int getNumero() {
      return _numero;
  }
  public void setNumero(int n) { _numero = n;}

Existe otro metodo para cobrar .

 
 public void cobrar() {
    System.out.println(getNumero() + " cobrando ...");
  }

La clase Alumno permite almacenar la clave de un alumno, y tiene metodos de acceso:


public class Alumno  {
    ....
}
See the complete code for Alumno here.
 private int _clave;
  public  int getClave() { return _clave;}
  public void setClave(int cv) { _clave = cv;}

La clase Persona, con el fin de tener los servicios de un Empleado y Alumno, se declaran dos referencias a dichas clases

  private Empleado _emp=new Empleado();
  private Alumno _alum= new Alumno();

La clase Persona contiene una propiedad nombre con sus metodos de acceso

  private  String _nombre;
  public  String getNombre() {
	return _nombre;
  }

Se delega cuando se definen dos metodos, para accesar el numero de Empleado y la clave de un Alumno. Se debe observar que el mensaje es procesado por los objetos de tipo Empleado y Alumno

 public int getNumero() {
      return _emp.getNumero();
  }
  public void setNumero(int n) { _emp.setNumero(n);}
  public void cobrar() {
    _emp.cobrar();
  }
  public  int getClave() { return _alum.getClave();}
  public void setClave(int cv) { _alum.setClave(cv);}

public class Persona  {
    ....
}
See the complete code for Persona here.

El diagrama UML es el siguiente: