Das Delegationsmuster ist eine grundlegende Technik in Software-Entwurfsmustern. Beim Delegationsmuster sind zwei Objekte an der Bearbeitung derselben Anfrage beteiligt, und das Objekt, das die Anfrage erhält, delegiert die Anfrage zur Verarbeitung an ein anderes Objekt. Das Delegationsmuster ist eine grundlegende Technik; viele andere Muster, wie das Zustandsmuster, das Strategiemuster und das Besuchermuster, verwenden im Wesentlichen das Delegationsmuster in spezifischeren Situationen. Das Delegationsmuster ermöglicht es uns, Aggregation statt Vererbung zu verwenden, und es ermöglicht uns auch, Mixins zu simulieren.

Einfaches Java-Beispiel

In diesem Beispiel hält die Klasse Printer, die einen Drucker simuliert, eine Instanz des Nadeldruckers RealPrinter, und die Methode print() von Printer delegiert die Verarbeitung an die Methode print() von 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();
     }
 }

Komplexes Java-Beispiel

Durch die Verwendung von Schnittstellen kann Delegation Typsicherheit erreichen und flexibler sein. In diesem Beispiel kann Klasse C an Klasse A oder Klasse B delegieren, und Klasse C verfügt über Methoden, die es ihr ermöglichen, zwischen Klasse A und Klasse B zu wählen. Da Klasse A oder Klasse B die von Schnittstelle I definierten Methoden implementieren muss, ist die Delegation hier typsicher. Dieses Beispiel zeigt, dass der Nachteil der Delegation darin besteht, dass sie mehr Code erfordert.

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

Quelle: https://zh.wikipedia.org/wiki/%E5%A7%94%E6%89%98%E6%A8%A1%E5%BC%8F