聊一下设计模式之委派模式

码农在囧途

每个人都在说风口,机遇,选择,但是能够遇上风口,抓住机遇,作出选择的前提是自己得有这个能力,不然,就算真让自己碰到了,也无能为力,任何成功的后面都经过无数次的尝试,努力,失败,只有经历这些后,才能判断风口,有能力抓住机遇,有辨别选择的思维,不然,大概率都是炮灰,或许今天做的事在别人看来,甚至在你看来都是无用功,其实不然,它已经在潜移默化的改变自己,锻造自己,在未来的某一天,它将会迸发出惊人的力量。加油吧!骚年

前言

在现实生活中,委派这个词可谓是随处可见,比如在我高一毕业时,去一个连锁婚纱店当推销员,前几天一直出去发传单,找人拍婚纱照,干了几天后,那个女二把手老板 就给我说,上级老板安排整理资料,需要找个员工来整理,她说觉得我可爱,就叫我整理了,这明显就是她自己不想整理,所以叫我整理,人在屋檐下,哪有不低头,所以就含泪整理了,不过后来干了没多久,受不了那种气氛,连夜提桶跑路了。

从我的这个遭遇里面,我们能够看出,不同层级的人之间存在层层委托,最终落到了我这个底层人员上面,后来参加工作,也时常被上级委托。

委派模式编码实现

使用代码实现领导与员工之间的任务委派,老板安排任务,部门经理收到命令后,委派相应的员工去做事。

任务接口

定义任务接口,定义一个方法dispatch(),由具体员工来实现。

/**
 * @author 刘牌
 * @date 2022/3/12 2:18
 */
public interface ITask {
    void dispatch(String task);
}
复制代码

部门经理委派类

部门经理就是委派者,它的作用就是对人物进行整理,然后分发给相应的员工,他用一个Map结构来存储,key为任务名称,value为具体 的实现者(员工),通过传递过来的key获取相应的实现者,调用对应的实现方法。

/**
 * @author 刘牌
 * @date 2022/3/12 2:22
 */
public class DeptLeader implements ITask {
    private final Map<String, ITask> staffTaskMap = new HashMap<>();

    public DeptLeader() {
        staffTaskMap.put("整理资料",new StaffLiu());
        staffTaskMap.put("收集资料",new StaffZhang());
        staffTaskMap.put("传送资料",new StaffLi());
    }

    @Override
    public void dispatch(String task) {
        if (staffTaskMap.containsKey(task)) staffTaskMap.get(task).dispatch(task);
    }
}
复制代码

员工具体任务类

员工就是做具体任务,三个员工分别被委托做事,员工刘整理资料,员工张手机资料,员工李传送资料,它们要做什么不由它们,是由部门领导 绝对,现实生活中如果老板叫你整理资料,你说你不想整理,你想扫地,那么你应该呆不久了。

/**
 * @author 刘牌
 * @date 2022-04-0622:37
 */
public class StaffLi implements ITask{
    @Override
    public void dispatch(String task) {
        System.out.println("员工李被委派:"+task);
    }
}

public class StaffLiu implements ITask {
    @Override
    public void dispatch(String task) {
        System.out.println("员工刘被委派:"+task);
    }
}

public class StaffZhang implements ITask {
    @Override
    public void dispatch(String task) {
        System.out.println("员工张被委派:"+task);
    }
}
复制代码

Boss下发命令

Boss下发命令整理资料,命令先下发到部门经理,部门经理再下发到具体员工。

/**
 * @author 刘牌
 * @date 2022/3/12 2:28
 */
public class BossClient {
    public static void main(String[] args) {
        DeptLeader deptLeader = new DeptLeader();
        deptLeader.dispatch("整理资料");
    }
}
复制代码

输出

员工刘被委派:整理资料
复制代码

到这里,一个简单委派模式的例子就完成了,比较简单。

思考

从上面的例子中我们发现委派是不是核代理模式很像,代理模式的思想就是自己不做具体的任务,让别人去做,委派模式也是一样,自己不做具体的任务, 而是委派给其他人来做,区别在于,在委派者这里,它由多种策略组成,根据不同的指令,选择不同的策略,所以,委派模式也是策略模式的思想,那么 综合一个,委派模式就是代理模式和策略模式的组合。

使用场景

那么我们在哪里使用委派模式呢?如果我们的系统中有很多类,它们的定义一样,都是相同的架子,只是处理方式不一样,需要根据不同的请求来调用不同 的类,那么可以选择委派模式,委派模式也能够很好的解耦系统代码,因为具体的任务让具体的类去实现,不用集中处理,当新增加任务,只需要增加相应 的实现类即可。

在一些开源框架和JDK中,也用到了委派模式,JDK双亲委派机制就是委派模式的思想,我们知道知道,JDK中加载一个类,会使用ClassLoader进行加载, 分为三个类加载器,启动类加载器Bootstrap ClassLoader,扩展类加载器Extension ClassLoader,应用程序类加载器Application ClassLoader 当我们加载一个类的时候,首先先去启动类加载器bootstrap找,如果有就直接用,如果没有就去扩展类加载器找,如果扩展类加载器没有,就去应用程序加载器找,如果还是没有,就报ClassNotFoundException异常。在SpringMVC中也是使用了委派模式,后面说SpringMVC的时候会详细说到。

今天的分享就到这里,感谢你的观看,我是小四,我们下期见。

猜你喜欢

转载自juejin.im/post/7083520892277358623