本文源码:GitHub·点这里 || GitEE·点这里

一、生活场景

1、场景描述

在公司的日常安排中,通常划分多个部门,每个部门又会分为不同的小组,部门经理的一项核心工作就是协调部门小组之间的工作,例如开发小组,产品小组,小组的需求统一汇总到经理,经理统一安排和协调。

2、场景图解

3、代码实现

  1. public class C01_InScene {
  2. public static void main(String[] args) {
  3. Manager manager = new Manager() ;
  4. EmployeeA employeeA = new EmployeeA("张三",manager) ;
  5. EmployeeB employeeB = new EmployeeB("李四",manager) ;
  6. employeeA.sendMsg(employeeA.name,"需要产品文档",employeeB);
  7. }
  8. }
  9. /**
  10. * 部门协调接口
  11. */
  12. interface Department {
  13. void coordinate (String userName,String msg,Employee employee) ;
  14. }
  15. /**
  16. * 部门经理
  17. */
  18. class Manager implements Department {
  19. @Override
  20. public void coordinate (String userName,String msg,Employee employee) {
  21. System.out.println("经理接收【"+userName+"】的协调任务:" + msg);
  22. System.out.println("经理转发【"+userName+"】协调任务,@【"+employee.name+"】");
  23. employee.getMsg(userName,msg);
  24. }
  25. }
  26. /**
  27. * 员工抽象类
  28. */
  29. abstract class Employee {
  30. public String name ;
  31. private Department department ;
  32. public Employee (String name,Department department){
  33. this.name = name ;
  34. this.department = department ;
  35. }
  36. public void getMsg (String userName,String msg){
  37. System.out.println("【"+this.name+"】收到"+"【"+userName+"】协调任务:["+msg+"]");
  38. }
  39. public void sendMsg (String name,String msg,Employee employee){
  40. System.out.println("【"+name+"】发起协调任务:"+ msg);
  41. department.coordinate(name,msg,employee);
  42. }
  43. }
  44. /**
  45. * 具体员工
  46. */
  47. class EmployeeA extends Employee {
  48. public EmployeeA(String name, Department department) {
  49. super(name, department);
  50. }
  51. }
  52. class EmployeeB extends Employee {
  53. public EmployeeB(String name, Department department) {
  54. super(name, department);
  55. }
  56. }

执行结果

  1. 【张三】发起协调任务:需要产品文档
  2. 经理接收【张三】的协调任务:需要产品文档
  3. 经理转发【张三】协调任务,@【李四】
  4. 【李四】收到【张三】协调任务:[需要产品文档]

二、调停者模式

1、基本概念

调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互显式引用,通过一个中介对象进行引用通知,从而对象之间解耦。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的对象间的相互作用。保证这些相互作用可以彼此独立地变化。

2、模式图解

3、核心角色

  • 抽象调停者角色

定义出同事对象到调停者对象的接口,其中主要方法是一个或多个事件方法。

  • 具体调停者角色

实现了抽象调停者所声明的事件方法。具体调停者持有所有的具体同事类,并负责协调各具体同事对象的交互信息。

  • 抽象同事类角色

定义出调停者到同事对象的接口。同事对象只持有调停者而不知道具体的同事对象。

  • 具体同事类角色

所有的具体同事类均从抽象同事类继承而来,需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事对象交互。

4、源码实现

  1. /**
  2. * 抽象调停者类
  3. */
  4. interface Mediator {
  5. void notify (Colleague colleague);
  6. }
  7. /**
  8. * 抽象同事类
  9. */
  10. abstract class Colleague {
  11. /* 持有调停者对象 */
  12. private Mediator mediator;
  13. public Colleague(Mediator mediator){
  14. this.mediator = mediator;
  15. }
  16. public Mediator getMediator(){
  17. return mediator;
  18. }
  19. }
  20. /**
  21. * 具体调停者类
  22. */
  23. class ConcreteMediator implements Mediator{
  24. private ConcreteColleagueA colleagueA ;
  25. private ConcreteColleagueB colleagueB ;
  26. public void setColleagueA(ConcreteColleagueA colleagueA) {
  27. this.colleagueA = colleagueA;
  28. }
  29. public void setColleagueB(ConcreteColleagueB colleagueB) {
  30. this.colleagueB = colleagueB;
  31. }
  32. @Override
  33. public void notify(Colleague colleague) {
  34. System.out.println("协调通知消息");
  35. }
  36. }
  37. /**
  38. * 具体同事类
  39. */
  40. class ConcreteColleagueA extends Colleague{
  41. public ConcreteColleagueA(Mediator mediator) {
  42. super(mediator);
  43. }
  44. public void operate(){
  45. getMediator().notify(this);
  46. }
  47. }
  48. class ConcreteColleagueB extends Colleague{
  49. public ConcreteColleagueB(Mediator mediator) {
  50. super(mediator);
  51. }
  52. public void operation(){
  53. getMediator().notify(this);
  54. }
  55. }

三、调停者模式总结

  • 松散耦合

调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合。

  • 集中管理交互

多个同事对象的交互,被封装在调停者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改调停者对象就可以了。

  • 简化对象间关系

没有使用调停者模式的时候,同事对象之间的关系通常是多对多的,引入调停者对象以后,调停者对象和同事对象的关系通常变成双向的一对多。

  • 模式的缺点

调停者模式的一个潜在缺点是,过度集中化,当同事对象很多,交互非常、复杂时,会导致调停者对象变得十分复杂,而且难于管理和维护。

四、源代码地址

  1. GitHub·地址
  2. https://github.com/cicadasmile/model-arithmetic-parent
  3. GitEE·地址
  4. https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(17):调停者模式的更多相关文章

  1. Java描述设计模式(24):备忘录模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时, ...

  2. Java描述设计模式(12):外观模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 在移动互联网没有普及之前,去饭店吃饭的流程大致如下:选座位,排队,点菜,结账.后来移动互联网普及,通过手机APP就 ...

  3. Java描述设计模式(08):桥接模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥 ...

  4. Java描述设计模式(05):原型模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出 ...

  5. Java描述设计模式(16):代理模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 在电商高速发展的今天,快递的数量十分庞大,甚至出现了快递代理行业,简单的说就是快递的主人没有时间收快递,会指定一个 ...

  6. Java描述设计模式(19):模板方法模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付.现在基于模板方法模式进行该过程描述. public c ...

  7. Java描述设计模式(21):状态模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 变色龙是爬行动物,是非常奇特的动物,它有适于树栖生活的种种特征和行为,身体也会随着环境的变化而变化出适应环境的颜色 ...

  8. Java描述设计模式(22):策略模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策 ...

  9. Java描述设计模式(23):访问者模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 电竞是游戏比赛达到"竞技"层面的体育项目.利用电子设备作为运动器械进行的.人与人之间的智力对抗 ...

随机推荐

  1. JS的加减乘除高精度

    //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:accDiv(arg1,arg2) ...

  2. Adobe PS常用快捷键

    ps使用快捷键 新建图层    Ctrl+Shift+N 取消选择区  Ctrl + D 新建标题    Ctrl + N 图片放大 Alt+鼠标滑动 图片位置拖动    空格 + 鼠标拖动 移动图层 ...

  3. 加密解密 之base系列编码

    Base16 Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码.Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来, ...

  4. 爬虫之beautifulsoup篇之一

    一个网页的节点太多,一个个的用正则表达式去查找不方便且不灵活.BeautifulSoup将html文档转换成一个属性结构,每个节点都是python对象.这样我们就能针对每个结点进行操作.参考如下代码: ...

  5. CH3803扑克牌

    Description 背景 lqhsr生日那天,Rainbow来找lqhsr玩扑克牌-- 玩着玩着Rainbow觉得太没意思了,于是决定给lqhsr一个考验~~~ 描述 Rainbow把一副扑克牌( ...

  6. App元素定位

    1.元素定位(采用Appium-desktop自带的工具) 1.1将初始化参数复制进去校验json格式正确且保存后,点击start session 初始化参数来源如下: # 定义启动设备需要的参数 d ...

  7. php函数fsockopen的使用

    函数说明:fsockopen — 打开一个网络连接或者一个Unix套接字连接 语法: resource fsockopen ( string $hostname [, int $port = -1 [ ...

  8. windows自带的netsh的使用

    0x01netsh简介 自Windows XP开始,Windows中就内置网络端口转发的功能.任何传入到本地端口的TCP连接(IPv4或IPv6)都可以被重定向到另一个本地端口,或远程计算机上的端口, ...

  9. java集合之ArrayList链表基础

    ArrayList可变数组 : arrayList继承AbstractList抽象类,实现list接口,底层基于数组实现.可存放null,除了非同步的之外,大致等同Vector.适用快速访问,复制.序 ...

  10. ArrayList源码解析(二)

    欢迎转载,转载烦请注明出处,谢谢. https://www.cnblogs.com/sx-wuyj/p/11177257.html 自己学习ArrayList源码的一些心得记录. 继续上一篇,Arra ...