设计模式之代理模式—委派模式(重点区分说明与代理模式的区别)

虽然老板->经理->员工这个例子用在委派模式已经是烂大街的例子了,但是足以说明这个例子的经典,能够很好的解释委派模式,本篇依旧用这个例子来简单说明一下委派模式,但是本文重点是在最后说清楚委派模式与代理模式的区别

委派模式:你找我,我作为中间人,我又根据你的需求去找别人,这就是委派模式

下图很好的说明了委派模式这个过程:图是网上一个博友那儿找的。。。

(图片地址: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);

重点:领导不知道有哪些员工,领导只关心经理是谁以及他的需求是什么,只管去找经理,让他去找员工完成他的事情,类似于:一对一对多的关系(员工是多个)


版权声明:本文为qq_36608921原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>