6.设计模式-委派模式(行为型)
案例
BOSS发出指令
package com;
public class Boss {
public void command(String task,Leader leader){
leader.doing(task);
}
}
抽象任务角色
定义一个抽象接口,有若干实现类
package com;
public interface IEmployee {
void doing(String task);
}
具体任务角色
真正执行任务的角色
package com;
public class EmployeeA implements IEmployee {
protected String goodAt = "编程";
public void doing(String task) {
System.out.println("我是员工A,我擅长" + goodAt + ",现在开始做" +task + "工作");
}
}
package com;
public class EmployeeB implements IEmployee {
protected String goodAt = "平面设计";
public void doing(String task) {
System.out.println("我是员工B,我擅长" + goodAt + ",现在开始做" +task + "工作");
}
}
委派者角色
负责在各个角色实例之间做出决策,并判断调用具体的实现方法
package com;
import java.util.HashMap;
import java.util.Map;
public class Leader implements IEmployee {
private Map<String, IEmployee> employee = new HashMap<String, IEmployee>();
public Leader(){
employee.put("爬虫",new EmployeeA());
employee.put("海报图",new EmployeeB());
}
public void doing(String task) {
if(!employee.containsKey(task)){
System.out.println("这个任务" +task + "超出我的能力范围");
return;
}
employee.get(task).doing(task);
}
}
调用
package com;
public class Test {
public static void main(String[] args) {
new Boss().command("海报图",new Leader());
new Boss().command("爬虫",new Leader());
new Boss().command("卖手机",new Leader());
}
}
委派模式与代理模式的区别
委派模式与代理模式的区别:(拿领导、经理、员工来举例)
-
代理模式:领导 明确知道 我要找员工A干活,但是我不直接找员工A,我去找经理,让经理去找员工A;
重点:领导明确知道员工A的存在(代理对象代理时要传入被代理类),所以,经理也只会去找员工A(经理代理员工A),类似于:一对一对一的关系;
-
委派模式:领导不关心有哪些员工,不需要知道员工,我直接说出我的需求,去找经理,经理根据领导的需求去找能够干这个活的员工(如:加密就去找员工A、数据处理就去找员工B);
重点:领导不知道有哪些员工,领导只关心经理是谁以及他的需求是什么,只管去找经理,让他去找员工完成他的事情,类似于:一对一对多的关系(员工是多个)
委派主要解决什么问题,什么情况下要委派。
将不同的任务分给不同的类,让不同的类职责变得单一,当任务比较大时,可以通过委派模式将任务分发给不同的类执行。委派者不会做或者没有做该事情,而是把具体的事情交给了具体类。