设计模式 - 委派模式

理解

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

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

更直白的表达就是,比如,我们想要盖一栋楼房,盖完之后我要刷漆,这些事情我自己肯定不能做,所以我这时候就会去找一个“包工头”来帮我完成这件事情,我只要告诉“包工头”我要盖房子、我要给房子刷漆等命令,其他的事情我不管,最终能够交付给我这个刷完漆房子就行。那么“包工头”也不可能自己来干的吧,这个时候他就会去找人,盖楼房的、刷漆的等等;然后叫他们来干这件事情,干完之后,交付给我一个刷完漆的房子即可。这个过程也就是委派模式的一个体现。

委派模式看上去和我们之前所说的“静态模式”非常相似,它可以说是一种特殊情况的静态代理的全权代理。但是也是有区别的,“静态代理”更注重的是过程,而“委派模式”只注重“结果”。

示例

我们现在就以上述中的例子,用代码来实现以下:

代码

先创建工人抽象类接口,他们都具有干活的功能 Worker

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

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

/**
 * 工人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,他是专业刷漆的 WorkerB

/**
 * 工人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);
    }
}

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

/**
 * 我,需要盖楼的人,给包工头下达盖楼、刷漆的命令
 *
 * @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://www.cnblogs.com/eamonzzz/p/11750562.html

时间: 2024-10-17 16:07:45

设计模式 - 委派模式的相关文章

java 设计模式 --委派模式

委派模式(Delegate)原理: 类B和类A是两个互相没有任何关系的类,但是B具有和A一模一样的方法和属性:并且调用B中的方法/属性就是调用A中同名的方法和属性. B好像就是一个受A授权委托的中介,第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来. 委派模式使得我们可以用聚合来代替继承,看如下代码: // 类模拟打印机Printer拥有针式打印机RealPrinter的实例 //Printer拥有的

设计模式之委派模式,大名鼎鼎的Spring都在用

什么是委派模式 虽然说委派模式不属于Gof23中设计模式,但这并不影响它成为一种经典的设计模式. "委派"字面意思就是指派一件事情给某人.类比到生活中的场景,比如项目leader指派开发任务给下面的猿猿们.这听起来有点像静态代理,不过还是不一样的,你品,你细品!代理强调的是过程,主要是要在代理过程中加入一些动作的,而委派主要是分配和分发. 代码实现 我们先新建一个业务处理接口BusinessService public interface BusinessService { void

委派模式

委派模式(Delegate)是面向对象设计模式中常用的一种模式.这种模式的原理为类B和类A是两个互相没有任何关系的类,B具有和A一模一样的方法和属性:并且调用B中的方法,属性就是调用A中同名的方法和属性.B好像就是一个受A授权委托的中介.第三方的代码不需要知道A的存在,也不需要和A发生直接的联系,通过B就可以直接使用A的功能,这样既能够使用到A的各种公能,又能够很好的将A保护起来了.一举两得,岂不很好!下面用一个很简单的例子来解释下: <span style="font-size:18px

设计模式---策略模式Strategy(对象行为型)

1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理. 2. 应用场景 (1)多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为. (2)需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现. (3)对客户隐藏具体策略(算法)的实现细节,彼此完全独立. 3. 示例 出行旅游:我们可以有几个策略可以考虑:可

【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

[转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式Struts2调用流程 转载自  http://downpour.iteye.com/blog/1335991 Struts2中的设计模式 设计模式(Design pattern)是经过程序员反复实践后形成的一套代码设计经验的总结.设计模式随着编程语言的发展,也由最初的“编程惯例”逐步发展成为被反复使用

设计模式——门面模式(Facade)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 设计模式学习笔记 --Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1.概念 门面模式是对象的结构模式,外部与一个子系统的通信必须通过一个统一的门面对象进行.门面模式提供一个高层次的接口,使得子系统更易于使用. 2.针对的问题 为子系统提供一个高层次的接口,使子系统易于使用. 适用性: 1)当你要为一个复杂子系统提供一个简单接口时.子系统往往因为不断演化而变得越来越复杂.大多数模式使用

[转] Android中的设计模式-备忘录模式

转自Android中的设计模式-备忘录模式 定义 备忘录设计模式的定义就是把对象的状态记录和管理委托给外界处理,用以维持自己的封闭性. 比较官方的定义 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 角色 笔记本:很多的内部状态需要被建立一个备忘录来管理,创建和取出

委派模式和策略模式

一.委派模式 委派模式(Delegate Pattern):指负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果.(属于行为型模式,但它不属于GOF的23种设计模式之一.类名以Delegate和Dispatcher结尾的一般都是委派模式) 委派模式在Spring中应用非常多,大家常用的DispatcherServlet其实就用到了委派模式.现实生活中也常有委派的场景发生,例如:老板(Boss)给项目经理(Leader)

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供