设计模式之代理模式—委派模式(重点区分说明与代理模式的区别)
虽然老板->经理->员工这个例子用在委派模式已经是烂大街的例子了,但是足以说明这个例子的经典,能够很好的解释委派模式,本篇依旧用这个例子来简单说明一下委派模式,但是本文重点是在最后说清楚委派模式与代理模式的区别;
委派模式:你找我,我作为中间人,我又根据你的需求去找别人,这就是委派模式
下图很好的说明了委派模式这个过程:图是网上一个博友那儿找的。。。
(图片地址:yinni11博友的博客:https://blog.csdn.net/yinni11/article/details/81545889)
1、员工接口Staff(经理与具体员工都实现该接口)
public interface Staff {
//做事的方式,传入标识things以找到不同的执行者
void doing(String thing);
}
2、经理Leader(由于我使用的枚举管理员工与他的擅长的事情的对应关系所以,leader有两种写法供参考)
2.1、leader类的第一种写法(map方式):
public class Leader implements Staff {
//装有不同的执行者,根据key,去匹配不同的执行者(value)
private Map<String,Staff> staffMap = new HashMap<String,Staff>();
public Leader(){
//A员工
staffMap.put(ThingEnum.STAFF_A.getThing(),ThingEnum.STAFF_A.getStaff());
//B员工
staffMap.put(ThingEnum.STAFF_B.getThing(),ThingEnum.STAFF_B.getStaff());
}
@Override
public void doing(String thing) {
staffMap.get(thing).doing(thing);
}
}
2.2、leader类的第二种写法(无map形式,通过枚举类的值来匹配--枚举类的代码在下面第5点,更简洁):
public class Leader implements Staff {
@Override
public void doing(String thing) {
for(ThingEnum t : ThingEnum.values()){
if (t.getThing().equals(thing)){
t.getStaff().doing(thing);
break;
}
}
}
}
3、员工A:StaffA
public class StaffA implements Staff{
@Override
public void doing(String thing) {
System.out.println("我是员工A,我擅长做:"+thing);
}
}
4、员工B:StaffB
public class StaffB implements Staff{
@Override
public void doing(String thing) {
System.out.println("我是员工B,我擅长做:"+thing);
}
}
5、枚举类ThingEnum:用于统一管理员工与他擅长做的事情
public enum ThingEnum {
STAFF_A("加密",new StaffA()),
STAFF_B("数据处理",new StaffB());
private String thing;
private Staff staff;
//私有构造方法
private ThingEnum(String thing,Staff staff){
this.thing = thing;
this.staff = staff;
}
public String getThing(){return thing;}
public Staff getStaff(){return staff;}
}
6、测试类:
public class DelegateTest {
public static void main(String[] args) {
Leader leader = new Leader();
//我要做加密
leader.doing("加密");
//我要做数据处理
leader.doing("数据处理");
}
}
测试结果:
委派模式总结:boss(测试类),通过传入自己的需求(如:加密)去找到leader,leader通过boss的需求,找到擅长进行数据加密的员工A进行操作;重要的是,要存储员工以及员工所擅长的事的对应关系(map存储对应关系,或者直接利用枚举类)
委派模式与代理模式的区别:(拿领导、经理、员工来举例)
1、代理模式:领导 明确知道 我要找员工A干活,但是我不直接找员工A,我去找经理,让经理去找员工A;
重点:领导明确知道员工A的存在(代理对象代理时要传入被代理类),所以,经理也只会去找员工A(经理代理员工A),类似于:一对一对一的关系;
2、委派模式:领导不关心有哪些员工,不需要知道员工,我直接说出我的需求,去找经理,经理根据领导的需求去找能够干这个活的员工(如:加密就去找员工A、数据处理就去找员工B);
重点:领导不知道有哪些员工,领导只关心经理是谁以及他的需求是什么,只管去找经理,让他去找员工完成他的事情,类似于:一对一对多的关系(员工是多个)