【设计模式】-04委派模式

1.什么是委派模式?

委派模式主要角色有三种: 抽象任务角色, 委派者角色, 具体任务角色. 实现层面上, 定义一个抽象接口, 它有若干实现类, 他们真正执行业务方法, 这些子类是具体任务角色; 定义委派者角色也实现该接口, 但它负责在各个具体角色实例之间做出决策, 由它判断并调用具体实现的方法. 委派模式对外隐藏了具体实现, 仅将委派者角色暴露给外部, 如Spring的DispatcherServlet. 意图 定义抽象接口的一个实现类, 他负责判断和调用哪个实现类的实例。

举个现实中的例子:比如老板想做一个项目,于是他把任务安排给了技术总监,然后技术总监根据每个人的实际情况分配了工作内容到每个人头上,对老板而言,他不需要关心具体是由谁完成了什么任务,对技术总监而言,他只负责分配任务并监督大家完成,他并不关心具体的代码实现,委派模式就是这样的.

2.为什么使用委派模式?

对内隐藏实现, 易于扩展; 简化调用;

委派模式大量使用在spring,mybatis等开源框架中, 理解委派模式的实现原理可以更好理解这些框架源码.

3.如何实现委派模式?

这里还以上面提到的那个现实中的例子去做一个简单的实现,重在理解.

现在老板需要做一个ERP系统,然后他把CTO叫来谈了一下,CTO拍着胸脯说没问题,交给在下,然后CTO召集了手下的码农,根据他们的专长安排了工作任务. 其中关系类图如下:

《【设计模式】-04委派模式》

实现代码如下:

/**
 * 老板
 */
public class Boss {
    public static void main(String[] args) {
        CTO cto = new CTO();
        //老板跟CTO说我要做个ERP系统
        System.out.println("CTO啊,现在公司需要做一个ERP系统...");
        cto.dowork();
    }
}

 

/**
 * 技术总监
 */
public class CTO {
    public void dowork(){
        ICoder coderFront = new CoderFront();
        ICoder coderBack = new CoderBack();
        //CTO收到老板指令后,将任务分配给前端和后端,让他们去敲代码...
        System.out.println("好的,老板,我这就安排人去做...");
        coderFront.dowork();
        coderBack.dowork();
    }
}
/**
 * 码农
 */
public interface ICoder {
    void dowork();
}
/**
 * 后端码农
 */
public class CoderBack implements ICoder{
    @Override
    public void dowork() {
        System.out.println("我是后端,写java...");
    }
}
/**
 * 前端码农
 */
public class CoderFront implements ICoder {
    @Override
    public void dowork() {
        System.out.println("我是前端,写js...");
    }
}

 测试结果:

《【设计模式】-04委派模式》

代码其实我有点懒得写,太简单了… 委派模式有点像代理模式,如果你把CTO当做中介,是不是觉得跟代理模式像爆,两者最大的差别是代理模式更注重过程,委派模式更注重结果.

总结:
#客户请求(Boss)、委派者(Leader)、被被委派者(Target)
#委派者要持有被委派者的引用
#代理模式注重的是过程, 委派模式注重的是结果
#策略模式注重是可扩展(外部扩展),委派模式注重内部的灵活和复用
#委派的核心:就是分发、调度、派遣
#委派模式:就是静态代理和策略模式一种特殊的组合

值得注意的是,委派模式并不属于GOF23种设计模式,在spring源码中用的较多,所以还是有必要学习一下.

    原文作者:设计模式
    原文地址: https://blog.csdn.net/lovexiaotaozi/article/details/83995053
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞