前言
委派模式有点像代理模式又有点像策略模式。
1:什么是委派模式
委派模式是一种行为型模式,这种模式的原理为类 B和类 A 是两个互相没有任何关系的类,B 具有和 A 一模一样的方法和属性;并且调用 B 中的方法,属性就是调用 A 中同名的方法和属性。 B 好像就是一个受 A 授权委托的中介。 第三方的代码不需要知道 A 的存在,也不需要和 A 发生直接的联系,通过 B 就可以直接使用 A 的功能,这样既能够使用到 A 的各种功能,又能够很好的将 A 保护起来了,一举两得。
- 优点:
1、注重内部的灵活和复用 - 缺点:
1、代码量大,类更多。
总结:(装个壳子代理下,壳子可以是有相同方法或属性的普通类,或者接口等,像反向代理加策略模式)
代理模式主动的是过程,委派者主动的是结果 策略模式注重的是可扩展(外部扩展),委派模式注重的是内部的灵活和复用 委派模式是静态代理和策略模式的组合
2:代码示例
思想:普通类的例子、接口的例子
- 普通类 ```java //类模拟打印机Printer拥有针式打印机RealPrinter的实例 //Printer拥有的方法print()将处理转交给RealPrinter的print()方法 package Paint;
class RealPrinter { void print() { System.out.print(“something”); } }
class Printer { RealPrinter p = new RealPrinter(); // 委派 void print() { p.print(); } }
public class Main { public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
* 接口
```java
/***在这个例子里,类C可以委托类A或类B,类C拥有方法使自己可以在类A或类B间选择。因为类A或类B必须实现接口I规定的方法,所以在这里委托是类型安全的。**/
package Paint;
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 {
I i = new A();
public void f() {
i.f();
}
public void g() {
i.g();
}
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()
}
}
3: 双亲委派模式
java虚拟机类加载器中使用了双亲委派模式,是对委派模式的深度应用。
拓展: