Шаблон делегирования — это фундаментальный приём в шаблонах проектирования программного обеспечения. В шаблоне делегирования два объекта участвуют в обработке одного и того же запроса, и объект, получающий запрос, делегирует запрос другому объекту для обработки. Шаблон делегирования — это фундаментальный приём; многие другие шаблоны, такие как шаблон состояния, шаблон стратегии и шаблон посетителя, по существу применяют шаблон делегирования в более конкретных ситуациях. Шаблон делегирования позволяет использовать агрегацию вместо наследования, а также позволяет имитировать примеси.

Простой пример на Java

В этом примере класс, имитирующий принтер, Printer, содержит экземпляр матричного принтера RealPrinter, а метод print() класса Printer делегирует обработку методу print() класса 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();
     }
 }

Сложный пример на Java

Используя интерфейсы, делегирование может обеспечить типобезопасность и стать более гибким. В этом примере класс C может делегировать классу A или классу B, и класс C имеет методы, позволяющие ему выбирать между классом A и классом B. Поскольку класс A или класс B должен реализовывать методы, определённые интерфейсом I, делегирование здесь является типобезопасным. Этот пример показывает, что недостаток делегирования заключается в том, что оно требует больше кода.

 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()
     }
 }

Источник: https://zh.wikipedia.org/wiki/%E5%A7%94%E6%89%98%E6%A8%A1%E5%BC%8F