El patrón de delegación es una técnica básica en los patrones de diseño de software. En el patrón de delegación, dos objetos participan en el procesamiento de la misma solicitud; el objeto que recibe la solicitud la delega a otro objeto para que la maneje. El patrón de delegación es una técnica básica; muchos otros patrones, como el patrón de estado, el patrón de estrategia y el patrón de visitante, esencialmente adoptan el patrón de delegación en circunstancias más especiales. El patrón de delegación nos permite usar la agregación en lugar de la herencia, y también nos permite simular mixins.
Ejemplo simple en Java
En este ejemplo, la clase que simula la impresora Printer tiene una instancia de la impresora de matriz de puntos RealPrinter, y el método print() de Printer transfiere el procesamiento al método print() de RealPrinter.
class RealPrinter { // the "delegate"
void print() {
System.out.print("something");
}
}
class Printer { // the "delegator"
RealPrinter p = new RealPrinter(); // create the delegate
void print() {
p.print(); // delegation
}
}
public class Main {
// to the outside world it looks like Printer actually prints.
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
Ejemplo complejo en Java
Mediante el uso de interfaces, la delegación puede ser de tipo seguro y más flexible. En este ejemplo, la clase C puede delegar en la clase A o en la clase B, y la clase C tiene métodos que le permiten elegir entre la clase A y la clase B. Debido a que la clase A o la clase B deben implementar los métodos definidos por la interfaz I, la delegación aquí es de tipo seguro. Este ejemplo muestra que la desventaja de la delegación es que requiere más código.
interface I {
void f();
void g();
}
class A implements I {
public void f() { System.out.println("A: doing f()"); }
public void g() { System.out.println("A: doing g()"); }
}
class B implements I {
public void f() { System.out.println("B: doing f()"); }
public void g() { System.out.println("B: doing g()"); }
}
class C implements I {
// delegation
I i = new A();
public void f() { i.f(); }
public void g() { i.g(); }
// normal attributes
public void toA() { i = new A(); }
public void toB() { i = new B(); }
}
public class Main {
public static void main(String[] args) {
C c = new C();
c.f(); // output: A: doing f()
c.g(); // output: A: doing g()
c.toB();
c.f(); // output: B: doing f()
c.g(); // output: B: doing g()
}
}
Fuente: https://zh.wikipedia.org/wiki/%E5%A7%94%E6%89%98%E6%A8%A1%E5%BC%8F