设计模式 - 委派模式

理解

首先委派模式不属于23种设计模式。前端

所谓委派,我的理解是:将为达到最终结果的事情交给其余人或中间人来干,我只要最终结果,其余的事情,由我委派的人来安排。java

更直白的表达就是,好比,咱们想要盖一栋楼房,盖完以后我要刷漆,这些事情我本身确定不能作,因此我这时候就会去找一个“包工头”来帮我完成这件事情,我只要告诉“包工头”我要盖房子、我要给房子刷漆等命令,其余的事情我无论,最终可以交付给我这个刷完漆房子就行。那么“包工头”也不可能本身来干的吧,这个时候他就会去找人,盖楼房的、刷漆的等等;而后叫他们来干这件事情,干完以后,交付给我一个刷完漆的房子便可。这个过程也就是委派模式的一个体现。git

委派模式看上去和咱们以前所说的“静态模式”很是类似,它能够说是一种特殊状况的静态代理的全权代理。可是也是有区别的,“静态代理”更注重的是过程,而“委派模式”只注重“结果”。github

示例

咱们如今就以上述中的例子,用代码来实现如下:spring

代码

先建立工人抽象类接口,他们都具备干活的功能 Worker设计模式

/**
 * 抽象 工人
 *
 * @author EamonZzz
 * @date 2019-10-26 15:09
 */
public interface Worker {
    /**
     * 干活
     *
     * @param command 听命令干活
     */
    void doWork(String command);
}

而后有一个工人A,砌砖砌的很好,很适合盖楼,WorkerAmvc

/**
 * 工人A 他砌砖砌的很好,因此叫来盖楼比较好
 *
 * @author EamonZzz
 * @date 2019-10-26 15:11
 */
public class WorkerA implements Worker {
    @Override
    public void doWork(String command) {
        System.out.println("我是工人A,包工头叫我 " + command);
    }
}

而后再来一个工人B,他是专业刷漆的 WorkerBide

/**
 * 工人A 他砌砖砌的很好,因此叫来盖楼比较好
 *
 * @author EamonZzz
 * @date 2019-10-26 15:11
 */
public class WorkerA implements Worker {
    @Override
    public void doWork(String command) {
        System.out.println("我是工人A,包工头叫我 " + command);
    }
}

再来找一个包工头,包工头也是一名工人,可是这个包工头主要是组织工人干活,Contractor测试

/**
 * 包工头(也是一名工人),承接项目,分配工人
 *
 * @author EamonZzz
 * @date 2019-10-26 15:07
 */
public class Contractor implements Worker {

    private Map<String,Worker> targets = new HashMap<String, Worker>();

    public Contractor() {
        targets.put("盖楼", new WorkerA());
        targets.put("刷漆", new WorkerB());
    }

    /**
     * 包工头不须要本身干活
     * @param command
     */
    @Override
    public void doWork(String command) {
        targets.get(command).doWork(command);
    }
}

最后就是有盖楼刷漆的需求的人,Bossspa

/**
 * 我,须要盖楼的人,给包工头下达盖楼、刷漆的命令
 *
 * @author EamonZzz
 * @date 2019-10-26 15:06:09
 **/
public class Boss {
    /**
     * 下达 请求
     *
     * @param command
     * @param contractor
     */
    public void command(String command, Contractor contractor) {
        contractor.doWork(command);
    }
}

来看一下测试类:

/**
 * @author EamonZzz
 * @date 2019-10-26 15:23
 */
public class BossTest {

    @Test
    public void test() {
        Boss boss = new Boss();
        boss.command("盖楼", new Contractor());
        boss.command("刷漆", new Contractor());
    }

}

最终结果:

我是工人A,包工头叫我 盖楼
我是工人B,包工头叫我 刷漆

类图

这个过程就模拟完毕,Boss 给包工头下达命令说我要盖楼,而后包工头就去找可以盖楼的人去盖楼;而后下达命令说,个人楼房须要刷漆了,包工头就去找刷漆的人来干这件事情。

SpringMVC中使用委派模式的场景

SpringMVC中,也有委派模式的身影,好比咱们最多见的 DispatcherServlet 它用来将咱们前端URL传过来的请求,分发到相应的 Controller 控制器来处理请求,那么它是怎么来完成这一过程的呢?

其实结合上面的实例场景就不难分析出来原理。


总结

对于“委派模式”和“静态代理模式”的区别,在文章开头已经提到过,“静态代理”注重过程,代理类和被代理类都要去实现一个接口;而“委派模式”更注重结果,Boss不须要实现Worker 这个接口。就拿敲代码这个能力来讲,“静态代理”的Boss类须要会敲代码,而“委派模式”中的Boss则不须要会敲代码。

源码地址:https://github.com/eamonzzz/java-advanced/tree/...

相关文章
相关标签/搜索