1. 定义
不属于 23 种设计模式之一,是面向对象设计模式中常用的一种模式.
这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性;并且调用B中的方法,属性就是调用A中同名的方法和属性。B好像就是一个受A授权委托的中介。第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来了。
2. 实例
下面以客户请求(Boss) 项目经理(leader) 开发者(Developer)为例 Boss告诉项目经理要做一个系统。项目经理得到命令后把任务派给developer去做。项目经理不做开发工作。由于每个开发者擅长的模块不同项目经理会把任务派给不同的开发者去做。
IDeveloper
/**
* 开发者都有收到命令做事情的能力
* @author lijun
* @since 2018-03-19 17:51
*/
public interface IDeveloper {
/**
*
* @param command
*/
public void doing(String command);
}
DeveloperA
/**
* 开发者A
* @author lijun
* @since 2018-03-19 17:51
*/
public class DeveloperA implements IDeveloper {
/**
* @param command
*/
@Override
public void doing(String command) {
System.out.println("我开发者A,我开始做:"+command);
}
}
DeveloperB
/**
*开发者B
* @author lijun
* @since 2018-03-19 17:51
*/
public class DeveloperB implements IDeveloper {
/**
* @param command
*/
@Override
public void doing(String command) {
System.out.println("我开发者B,我开始做:"+command);
}
}
Leader
/**
* 项目经理
* @author lijun
* @since 2018-03-19 17:51
*/
public class Leader {
/**
* 员工集合
*/
private Map<String,IDeveloper> targets = new HashMap<String,IDeveloper>();
public Leader() {
targets.put("login",new DeveloperA());
targets.put("encrypt",new DeveloperB());
}
/**
*项目经理不干活 委派给开发者
* @param command 命令
*/
public void doing(String command){
targets.get(command).doing(command);
}
}
Boss
/**
* Boss
* @author lijun
* @since 2018-03-19 17:51
*/
public class Boss {
public static void main(String[] args) {
new Leader().doing("login");
new Leader().doing("encrypt");
}
}
输出
我开发者A,我开始做:login
我开发者B,我开始做:encrypt
总结:
1. 委派的核心:就是分发、调度、派遣。
2. 委派模式:就是静态代理和策略模式一种特殊的组合
3. 代理模式注重的是过程, 委派模式注重的是结果
4. 策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用