Logotipo de ConstructiCat
CodeBust.
Explorar la sección ▾

Ocultar Delegado.

Problema

El cliente obtiene el objeto B a partir de un campo o método del objeto A. Después, el cliente llama a un método del objeto B.

Solución

Crea un nuevo método en la clase A que delegue la llamada al objeto B. Ahora el cliente no conoce la clase B ni depende de ella.

##Ejemplo

Antes
manager = person.getDepartment().getManager();
Después
manager = person.getManager();

class Person {
  Department getDepartment() { return department; }
  Person getManager() { return department.getManager(); }
}

##Por qué refactorizar

Para empezar, veamos algo de terminología:

  • Servidor es el objeto al que el cliente tiene acceso directo.

  • Delegado es el objeto final que contiene la funcionalidad que necesita el cliente.

Aparece una cadena de llamadas cuando un cliente solicita un objeto a otro objeto, después ese segundo objeto solicita otro, y así sucesivamente. Estas secuencias de llamadas obligan al cliente a navegar por la estructura de clases. Cualquier cambio en estas interrelaciones requerirá cambios en el lado del cliente.

##Ventajas

  • Oculta la delegación al cliente. Cuanto menos necesite saber el código cliente sobre los detalles de las relaciones entre objetos, más fácil será realizar cambios en tu programa.

##Cómo refactorizar

  1. Por cada método de la clase delegada llamado por el cliente, crea un método en la clase servidora que delegue la llamada a la clase delegada.

  2. Cambia el código cliente para que llame a los métodos de la clase servidora.

  3. Si tus cambios liberan al cliente de la necesidad de la clase delegada, puedes eliminar de la clase servidora el método de acceso a la clase delegada (el método que originalmente se usaba para obtener la clase delegada).