一、委派模式:
主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色.
实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法.委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部, 如Spring的DispatcherServlet.
二、实践
2.1 定义任务类接口
public interface ITask {
void doWork(String command);
}
2.2 定义实现任务类接口的实现类
//实现1
public class ConcreteCoderA implements ITask {
@Override
public void doWork(String command) {
System.out.println("CoderA is doing "+command);
}
}
//实现2
public class ConcreteCoderB implements ITask {
@Override
public void doWork(String command) {
System.out.println("CoderB is doing "+ command);
}
}
//实现3
public class ConcreteCoderC implements ITask {
@Override
public void doWork(String command) {
System.out.println("CoderC is doing "+command);
}
}
2.3 定义委派类
该类负责接收请求,并把任务分发给具体的实现类去完成任务,本身并不干活。
public class ManagerDelegate implements ITask {
private HashMap<String,ITask> task = new HashMap<>();
//封装所有的实现类,不然怎么去委派呢。
public ManagerDelegate() {
task.put("任务1",new ConcreteCoderA());
task.put("任务2",new ConcreteCoderB());
task.put("任务3",new ConcreteCoderC());
}
@Override
public void doWork(String command) {
//根据接收到的不同指令,将任务委派给不同的实现类去完成。
ITask coder = task.get(command);
if(null != coder){
coder.doWork(command);
}else{
System.out.println("该名员工跳槽跑了。。。");
}
}
}
2.4 测试
public class Boss {
public static void main(String[] args) {
ManagerDelegate manager = new ManagerDelegate();
manager.doWork("任务1");
manager.doWork("任务2");
manager.doWork("任务3");
manager.doWork("任务4");
}
}
打印结果如下!大boss下达了任务,表面上是项目经理在干活,其实是下面的coders在干活。
CoderA is doing 任务1
CoderB is doing 任务2
CoderC is doing 任务3
该名员工跳槽跑了。。。