详解委托模式

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承,它还使我们可以模拟mixin。

简单的Java例子

在这个例子里,类模拟打印机Printer拥有针式打印机RealPrinter的实例,Printer拥有的方法print()将处理转交给RealPrinter的方法print()。

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

第一部分:Go 语言基础模块一:Go 语言特性教学目标:理解 Go 语言基本语法理解 Go 语言常用数据类型理解 Go 语言常用小技巧深入理解 Go 语言的多线程编程针对的用户痛点:云原生从业者因为未熟练掌握 ...