设计模式系列总览
设计模式 | 飞机票 |
---|---|
三大工厂模式 | 登机入口 |
策略模式 | 登机入口 |
委派模式 | 登机入口 |
模板方法模式 | 登机入口 |
观察者模式 | 登机入口 |
单例模式 | 登机入口 |
原型模式 | 登机入口 |
代理模式 | 登机入口 |
装饰者模式 | 登机入口 |
适配器模式 | 登机入口 |
建造者模式 | 登机入口 |
责任链模式 | 登机入口 |
享元模式 | 登机入口 |
组合模式 | 登机入口 |
门面模式 | 登机入口 |
桥接模式 | 登机入口 |
中介者模式 | 登机入口 |
迭代器模式 | 登机入口 |
状态模式 | 登机入口 |
解释器模式 | 登机入口 |
备忘录模式 | 登机入口 |
命令模式 | 登机入口 |
访问者模式 | 登机入口 |
软件设计7大原则和设计模式总结 | 登机入口 |
什么是委派模式
委派模式(Delegate Pattern)不属于GOF23种设计模式内,委派模式的基本作用就是负责任务的调用和分配任务。委派模式在 Spring 中应用非常多,比如我们常用的 DispatcherServlet 其实就是用到了委派模式。现实生活中也常有委派的场景发生,比如老板给项目经理下达任务,然后项目经理拆分任务后分配给不同员工去实现不同的工作。
委派模式示例
下面就以老板给项目经理下达任务,项目经理拆分任务后分给各个开发人员为例来示范一下委派模式:
1、建立一个员工的接口类,定义一个工作方法,一个参数用来接收命令:
package com.zwx.design.pattern.delegate;
public interface IEmployee {
void work(String taskCommand);//工作方法
}
2、建立两个员工实现类来负责具体的工作
package com.zwx.design.pattern.delegate.impl;
import com.zwx.design.pattern.delegate.IEmployee;
public class EmployeeA implements IEmployee {
@Override
public void work(String taskCommand) {
System.out.println("我是员工A,我正在工作:" + taskCommand);
}
}
package com.zwx.design.pattern.delegate.impl;
import com.zwx.design.pattern.delegate.IEmployee;
public class EmployeeB implements IEmployee {
@Override
public void work(String taskCommand) {
System.out.println("我是员工B,我正在工作:" + taskCommand);
}
}
3、接下来再建立一个经理类,经理类的角色属于分发任务的重要角色,需要清楚给不同员工下达不同的命令
package com.zwx.design.pattern.delegate.impl;
import com.zwx.design.pattern.delegate.IEmployee;
import java.util.HashMap;
import java.util.Map;
public class Manager implements IEmployee {
private Map<String,IEmployee> workTargetMap = new HashMap<>();
public Manager() {
workTargetMap.put("部署项目",new EmployeeA());
workTargetMap.put("修复BUG",new EmployeeB());
}
@Override
public void work(String taskCommand) {
IEmployee employee = workTargetMap.get(taskCommand);
if(null == employee){
System.out.println("未找到可以执行任务的员工");
return;
}
employee.work(taskCommand);
}
}
4、再创建一个老板(Boss)类,用来给经理下达工作命令
package com.zwx.design.pattern.delegate;
import com.zwx.design.pattern.delegate.impl.Manager;
public class Boss {
public void startWork(String taskCommand,Manager manager){
manager.work(taskCommand);
}
}
5、最后让我们写一个测试类来测试一下
package com.zwx.design.pattern.delegate;
import com.zwx.design.pattern.delegate.impl.Manager;
public class TestDelegatePattern {
public static void main(String[] args) {
new Boss().startWork("部署项目",new Manager());
}
}
委派模式示例类图展示
员工和经理都继承自员工,而经理又持有了普通员工的引用,Boss负责下命令,Manager负责分发调度任务
委派模式和其他模式的区别
1、 与代理模式区别:代理模式注重的是代理的过程,比如我们需要在代理的过程中做一些事情,就适合用代理,而委派模式注重的是结果
2、与策略模式区别:策略模式更注重的是外部扩展,不同策略相互之间可以替代,而委派模式注重内部的灵活和复用
总结
1、委派者要持有被委派者的引用,委派者需要知道每一个被委派者能做什么
2、委派模式的核心:就是分发、调度、派遣任务
3、委培模式可以看做是静态代理和策略模式的一种特殊的组合