一、概念
一个对象接收到了请求,但是自己不处理,交给另外的对象处理,就是委托模式,例如 老板接到了活,然后把活转手给了工人去做。
在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。委托模式是一项基本技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式。委托模式使得我们可以用聚合来替代继承。
不属于 23 种设计模式之一,是面向对象设计模式中常用的一种模式。
特点:持有被委托人的引用,不关心过程,只关心结果。
归类:行为型模式
核心:可以理解为静态代理和策略模式一种特殊的组合
二、代码示例
举个列子
通过使用接口,委托可以做到类型安全并且更加灵活。在这个例子里,Manager可以委托员工A或员工B,Manager拥有方法使自己可以在员工A或员工B之间选择。因为员工A或员工B必须实现接口WorkPeople规定的方法,所以在这里委托是类型安全的。这个例子显示出委托的缺点是需要更多的代码。
Manager接到了搬砖的活,指定WorkerA去搬砖。
打工人必备技能接口类
public interface WorkPeople {
void f(String doWhat);
void g();
}
打工人之员工A
public class WorkerA implements WorkPeople {
@Override
public void f(String doWhat) {
System.out.println("WorkerA: doing " + doWhat);
}
@Override
public void g() {
System.out.println("WorkerA: doing g()");
}
}
打工人之员工B
public class WorkerB implements WorkPeople {
@Override
public void f(String doWhat) {
System.out.println("WorkerB: doing " + doWhat);
}
@Override
public void g() {
System.out.println("Manager: doing g()");
}
}
打工人之人上人经理
public class Manager implements WorkPeople {
private WorkPeople workPeople;
//翻牌子
public void toWho(WorkPeople workPeople) {
this.workPeople = workPeople;
}
@Override
public void f(String doWhat) {
workPeople.f(doWhat);
}
@Override
public void g() {
workPeople.g();
}
}
测试类
public class Test {
public static void main(String[] args) {
//员工A待命
WorkerA workerA = new WorkerA();
//员工B待命
WorkerB workerB = new WorkerB();
//经理接到活了,安排人去搬砖
Manager manager = new Manager();
//安排A
manager.toWho(workerA);
//搬砖
manager.f("搬砖");
}
}