委派模式的定义:是一种面向对象的设计模式,允许对象组合实现与继承相同的代码逻辑,它的基本作用就是负责任务的调度和分配,是一种特殊的静态代理,可以理解为全权代理,但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型模式,不属于GOF23中设计模式。
委派模式的结构:委派模式包含以下3个角色。
- 抽象任务角色(Task):定义任务的接口。
- 具体任务角色(Concrete):实现抽象任务角色的业务逻辑,是真正执行任务的角色。
- 委派者角色(Delegate):负责在各个具体角色之间做出决策,判断并调用具体的方法。
委派模式的通用实现:
//抽象任务角色
public interface Task {
void doTask();
}
//具体任务角色A
public class ConcreteA implements Task{
@Override
public void doTask() {
System.out.println("负责工作A!");
}
}
//具体任务角色B
public class ConcreteB implements Task{
@Override
public void doTask() {
System.out.println("负责工作B!");
}
}
//委派者角色
public class Delegate implements Task{
private String command;
public Delegate(String command){
this.command = command;
}
@Override
public void doTask() {
if("A".equals(command)){
new ConcreteA().doTask();
}else if("B".equals(command)){
new ConcreteB().doTask();
}else{
System.out.println("无人能做该任务!!!");
}
}
}
//测试类
public class Test {
public static void main(String[] args) {
Delegate delegate = new Delegate("A");
delegate.doTask();
}
}
委派模式的结构图:
委派模式的应用实例:Boss给Leader下达任务,Leader根据员工的特长分配任务。
//员工接口
public interface IEmployee {
void work(String task);
}
//员工张三
public class ZhangSan implements IEmployee{
@Override
public void work(String task) {
System.out.println("我是"+task+",我擅长写软件");
}
}
//员工李四
public class Lisi implements IEmployee{
@Override
public void work(String task) {
System.out.println("我是"+task+",我擅长卖软件");
}
}
//经理
public class Leader implements IEmployee{
private Map<String,IEmployee> employees = new HashMap<>();
public Leader(){
employees.put("研发",new ZhangSan());
employees.put("销售",new Lisi());
}
@Override
public void work(String task) {
if(employees.containsKey(task)){
employees.get(task).work(task);
}else{
System.out.println(task+",干不了!!!");
}
}
}
//老板
public class Boss {
public void command(Leader leader,String task){
leader.work(task);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Boss boss = new Boss();
boss.command(new Leader(),"研发");
boss.command(new Leader(),"销售");
}
}
上面应用实例的结构图:
委派模式在源码中的应用:ClassLoader类加载的双亲委派、SpringMVC中的dispatcherServlet。
委派模式的优点:对内隐藏实现, 易于扩展; 简化调用。
委派模式的缺点:在任务复杂的情况下需要进行多重委派,容易造成类的膨胀和紊乱,不利于管理。
委派模式的应用场景:
- 实现表现层和业务层之间的松耦合。
- 根据不同的场景调用不同的服务。