概述:

  委派模式有点像代理模式又有点像策略模式。 区别在于代理模式注重过程,委派模式注重结果。 生活中也有很多委派模式的例子:例如公司老板给项目经理下达任务,将任务全权交给项目经理,有项目经理根据一定的策略分配给小组成员,项目经理从跟到尾。项目经理就像是一个老板授权的中介,老板不需要跟小组成员直接联系,甚至可以不知道他们的存在。就像电视剧《楚汉传奇》里面韩信说的,他可以统领100万大军,只需要10个将军,他只负责管理调度这10个将军。不需要了解每个士兵的用途。

代码实现:

  我们干活的程序员实现公共的一个干活接口:

/**
* Created by gan on 2019/11/17 22:00.
*/
public interface ITarget { void doSomething(String commond);
}

  员工A和员工B(真正干活做事的人)实现接口做自己擅长的工作。

public class TargetA implements Itarget {

    @Override
public void doSomething(String commond) {
System.out.println("我是员工A,我擅长加密,我现在开始干:" + commond);
}
} public class TargetB implements Itarget { @Override
public void doSomething(String commond) {
System.out.println("我是员工A,我擅长解密,我现在开始干:" + commond);
}
}

  项目经理持有所有小组员工的成员,他根据一定的策略选择干活的人。

public class TeamLeader {

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

    /**
* 项目经理持有小组成员名单科通选择,类似于策略模式
*/
public TeamLeader() {
targets.put("加密", new TargetA());
targets.put("解密", new TargetB());
} /**
* “调度方法”
*/
public void dispather(String commond) {
targets.get(commond).doSomething(commond);
}
}

  Boss下达命令:

public class Boss {

    public commond(String commond, TeamLeader leader) {
leader.dispather(commond);
}
}

  使用:

public class DelegateTestDemo {

    public static void main(String[] args) {
Boss boss = new Boss();
boss.commond("加密", new TeamLeader());
}
}

总结:

  委派模式在实际开发中非常常用,比如我们写的Controller就是委派具体的Service干事情,Service也委派Dao干事情。 Spring中也有很多使用委派模式的地方,比如我们常见的DispatcherServlet 里面的service就大量使用委派模式

  再比如我们使用的HttpServlet里面也使用了委派模式:

 在一些框架源码中,比如Spring等,命名一Delegate结尾比如BeanDefinitionParserDelegate(根据不同的类型委派不同的逻辑解析BeanDefinition),或者是以Dispacher开头和结尾或开头的比如DispacherServlet一般都使用了委派模式。

代码链接:https://gitee.com/ganganbobo/gps-parent

Java设计模式之委派模式(Dellegate/Dispather)的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  3. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  4. 折腾Java设计模式之建造者模式

    博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...

  5. 折腾Java设计模式之备忘录模式

    原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...

  6. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  7. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  8. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

  9. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

随机推荐

  1. HAVING 搜索条件在进行分组操作之后应用

    HAVING 搜索条件在进行分组操作之后应用: 如:查询帖子访问量大于15的用户id: select t.user_id,u.name,sum(count_view) from t_topic t l ...

  2. 在安卓手机下按钮会悬浮在键盘上,怎么解决vue.js

    data里面 screenHeight: window.innerHeight mounted里面 mounted () { var that = this var u = navigator.use ...

  3. 新版本Mariadb安装后相关问题的解决

    给新机器Ubuntu安装的Mariadb后无法登录,通过网上各种方法修改root用户密码,仍然无法解决,耗费几个小时! 经过看日志和查手册,发现原因如下: ubuntu确实安装没有启用root用户,所 ...

  4. go 指南学习笔记

    1   If  for 后面没有小括号.后面的花括号,要在当前行,并且中间有内容,右花括号要单独一行. 因为go会格式化代码,自动插入分号. 2 函数和方法的区别: 方法需要有一个接受者(select ...

  5. 日期正则表达式yyyyMMdd

    日期校验yyyyMMdd, 包括闰月等校验. package com.xgcd; import java.util.regex.Matcher; import java.util.regex.Patt ...

  6. c 越界

    int main(int argc, char* argv[]){ int i = 0; int arr[3] = {0}; for(; i<=3; i++){ arr[i] = 0; prin ...

  7. filebeat获取nginx的access日志配置

    filebeat获取nginx的access日志配置 产生nginx日志的服务器即生产者服务器配置: 拿omp.chinasoft.com举例: .nginx.conf主配置文件添加日志格式 log_ ...

  8. UBI mkfs.ubifs 参数记录

    NAND 硬件结构如下: 脚本如下 sudo mkfs.ubifs -q -r rootfs_iproute -m 4096 -e 248KiB -c 3840 -o ubifs.img -F ech ...

  9. Qt button按钮添加Label标签播放GIF图片

    QPushButton btn = new QPushButton(); QVBoxLayout* layout = new QVBoxLayout(btn); QLabel* label = new ...

  10. php中类的不定参数使用示例

    在类的实例化过程中,可以带或不带参数,那么构造函数将如何处理这些参数呢?为了使构造函数具有通用性,在定义构造函数时,一般不带参数,然后在其内部对参数情况进行处理.下面代码显示了一个完整的通用Perso ...