【笔记整理】图解设计模式 | 导航


定义

  • 组员向仲裁者报告,仲裁者向组员下达指示。
  • 当发生麻烦事情的时候,通知仲裁者;当发生涉及全体组员的事情时,也通知仲裁者。
  • 当仲裁者下达指示时,组员会立即执行。团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向仲裁者报告。
  • 另一方面,仲裁者站在整个团队的角度上对组员上报的事情做出决定。

Mediator模式中的登场角色

  • Mediator(仲裁者、中介者)

Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。

  • ConcreteMediator(具体的仲裁者、中介者)

ConcreteMediator角色负责实现Mediator角色的接口(API),负责实际做出决定。

  • Colleague(同事)

Colleague角色负责定义与Mediator角色进行通信的接口(API)。

  • ConcreteColleague(具体的同事)

ConcreteColleague角色负责实现Colleague角色的接口(API)。


Mediator模式的类图


拓展思路的要点

  • 当发生分散灾难时

面向对象编程可以帮助我们分散处理,避免处理过于集中,也就是说可以“分而治之”。

但有时候,把处理分散在各个类中是不明智的。如果只是将应当分散的处理分散在各个类中,但是没有将应当集中的处理集中起来,那么这些分散的类最终只会导致灾难。

  • 通信线路的增加

A和B,相互通信线路有两条。

A、B和C,相互通信线路有6条。

A、B、C和D,相互通信线路有12条。

......

如果存在很多相互通信的实例,那么程序结构会变得非常复杂。

如果实例很少就不需要Mediator模式了吗?需要考虑的是,即使最初实例很少,很可能随着需求变更实例数量会慢慢变多,迟早会暴露出问题。

  • 哪些角色可以复用

ConcreteColleague角色可以复用(原因:内部无逻辑),但ConcreteMediator角色很难复用(原因:逻辑集中)。

依赖于特定应用程序就意味着难以复用。


相关的设计模式

  • Facade模式(第15章)

在Mediator模式中,Mediator角色与Colleague角色进行交互。

而在Facade模式中,Facade角色单方面地使用其他角色来对外提供高层接口(API)。因此,可以说Mediator模式是双向的,而Facade模式是单向的。

  • Observer模式(第17章)

有时会使用Observer模式来实现Mediator角色与Colleague角色之间的通信。


代码

  • Mediator(仲裁者、中介者)
public interface Mediator {// 生成Mediator要管理的组员void createColleagues();// 被各个Colleague组员调用,当组员状态发生变化时,该方法会被调用void colleagueChanged();
}
  • ConcreteMediator(具体的仲裁者,中介者)
public class LoginFrame extends Frame implements ActionListener, Mediator {private static final long serialVersionUID = 1L;private ColleagueCheckbox checkGuest;private ColleagueCheckbox checkLogin;private ColleagueTextField textUser;private ColleagueTextField textPass;private ColleagueButton buttonOk;private ColleagueButton buttonCancel;// 构造函数// 生成并配置各个Colleague后,显示对话框@SuppressWarnings("deprecation")public LoginFrame(String title) {super(title);setBackground(Color.lightGray);// 使用布局管理器生成4x2窗格setLayout(new GridLayout(4, 2));// 生成各个ColleaguecreateColleagues();// 配置add(checkGuest);add(checkLogin);add(new Label("Username:"));add(textUser);add(new Label("Password:"));add(textPass);add(buttonOk);add(buttonCancel);// 设置初始的启用/禁用状态colleagueChanged();// 显示pack();show();}// 生成各个Colleague@Overridepublic void createColleagues() {// 生成CheckboxGroup g = new CheckboxGroup();checkGuest = new ColleagueCheckbox("Guest", g, true);checkLogin = new ColleagueCheckbox("Login", g, false);textUser = new ColleagueTextField("", 10);textPass = new ColleagueTextField("", 10);textPass.setEchoChar('*');buttonOk = new ColleagueButton("OK");buttonCancel = new ColleagueButton("Cancel");// 设置MediatorcheckGuest.setMediator(this);checkLogin.setMediator(this);textUser.setMediator(this);textPass.setMediator(this);buttonOk.setMediator(this);buttonCancel.setMediator(this);// 设置ListenercheckGuest.addItemListener(checkGuest);checkLogin.addItemListener(checkLogin);textUser.addTextListener(textUser);textPass.addTextListener(textPass);buttonOk.addActionListener(this);buttonCancel.addActionListener(this);}// 接收来自于Colleague的通知然后判断各colleague的启用/禁用状态@Overridepublic void colleagueChanged() {if (checkGuest.getState()) { // Guest modetextUser.setColleagueEnabled(false);textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(false);} else { // Login modetextUser.setColleagueEnabled(true);userpassChanged();}}// 当textUser或textPass文本输入框的文字发生变化时// 判断各Colleague的启用/禁用状态private void userpassChanged() {if (textUser.getText().length() > 0) {textPass.setColleagueEnabled(true);if (textPass.getText().length() > 0) {buttonOk.setColleagueEnabled(true);} else {buttonOk.setColleagueEnabled(false);}} else {textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(false);}}@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e.toString());System.exit(0);}}
  • Colleague(同事)
public interface Colleague {void setMediator(Mediator mediator);// 告知组员仲裁者所下达的指示void setColleagueEnabled(boolean enabled);
}
  • ConcreteColleague(具体的同事)
import java.awt.Button;public class ColleagueButton extends Button implements Colleague {private static final long serialVersionUID = 1L;@SuppressWarnings("unused")private Mediator mediator;public ColleagueButton(String caption) {super(caption);}@Overridepublic void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) { // Mediator下达启动/禁用的指示setEnabled(enabled);}}
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {private static final long serialVersionUID = 1L;private Mediator mediator;public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) { // 构造函数super(caption, group, state);}@Overridepublic void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) { // Mediator下达启用/禁用指示setEnabled(enabled);}@Overridepublic void itemStateChanged(ItemEvent e) { // 当状态发生变化时通知Mediatormediator.colleagueChanged();}}
import java.awt.Color;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;public class ColleagueTextField extends TextField implements TextListener, Colleague {private static final long serialVersionUID = 1L;private Mediator mediator;public ColleagueTextField(String text, int columns) { // 构造函数super(text, columns);}@Overridepublic void setMediator(Mediator mediator) { // 保存Mediatorthis.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) { // Mediator下达启用/禁用的指示setEnabled(enabled);setBackground(enabled ? Color.white : Color.lightGray);}@Overridepublic void textValueChanged(TextEvent e) { // 当文字发生变化时通知Mediatormediator.colleagueChanged();}}
  • Main
public class Main {public static void main(String[] args) {new LoginFrame("Mediator Sample");}}

注:博客中的图片来自网上。

【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)相关推荐

  1. 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)

    [笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...

  2. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  3. 第 16 章 模板方法模式

    第 16 章 模板方法模式 1.豆浆制作问题 编写制作豆浆的程序, 说明如下: 制作豆浆的流程:选材->添加配料->浸泡->放到豆浆机打碎 通过添加不同的配料, 可以制作出不同口味的 ...

  4. SaaS模式、技术与案例详解——第16章 SaaS模式可行性分析

    [本章导读语] 模型可以澄清相互间的关系,识别出关键元素,有意识地减少可能 引起的混淆. ________凯文.福斯伯格,<可视化项目管理> SaaS系统包括SaaS平台及应用系统,Saa ...

  5. 【设计模式】第二章 代理模式

    第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...

  6. 23种设计模式(第二章创建者模式5种)

    第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ​ ...

  7. 大战设计模式【16】—— 桥接模式

    桥接模式(Bridge) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 将抽象部分与其实现部分分离,使得他 ...

  8. 设计模式--第七章 克隆模式

    第七章 克隆模式 1. 核心思想 2. UML类图 3. 框架代码 4. 优缺点 5. 应用场景 1. 核心思想 用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象. 通过拷贝自身 ...

  9. 中介者(Mediator)模式--------------只有一个仲裁者

    >>组员向仲裁者报告,仲裁者向组员下达指示.组员之间不再相互 询问和相互指示. >>在该模式中:一方面,当发生麻烦事情的时候,通知仲裁者:当 发生涉及全体组员的事情时,也通知仲 ...

最新文章

  1. Redis 那些故障转移、高可用方案
  2. error C4668: 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用“0”替换“#if/#elif”
  3. 【Android开发】NDK开发(1)-Hello World!
  4. python asyncio 并发编程_asyncio并发编程
  5. 初学python之列表
  6. python2 md5加密_Python的加密方式:MD5加密
  7. 与以太坊同源异流,eCash“PoW+雪崩”组合共识各司其职
  8. 树莓派4b安装win11/10过程全教程(附蓝屏inaccessible boot device解决办法)
  9. 基于Python的离线OCR图片文字识别(三)——支持PDF文件
  10. max232c语言,串行口通信(STC89C52+MAX232):串行口通信硬件设计详解
  11. python绘制动态心电图_东软医院收费端使用手册.doc
  12. 大数据 端到端_成为数据科学家的端到端指南
  13. config语言和config.in文件
  14. 卡巴斯基公布财报,2020年业务稳定增长
  15. 深度学习目标检测最全综述
  16. ls -la /usr/home/guest/ | more
  17. 基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)
  18. 3DMAX高级光照相关的名词解释
  19. 简单U盘修复工具(SURT).hta
  20. Image加载二进制数据图片

热门文章

  1. P1757 通天之分组背包 (分组背包 模板
  2. React回调函数两种常用方式
  3. js 中编码(encode)和解码(decode)的三种方法(传递是特殊符号丢失问题,如‘+’)
  4. Huawei 华为云 机器翻译调用 详解
  5. Elasticsearch实现类百度搜索引擎搜索功能ES5.5.0v
  6. 服务器独享宽带和共享宽带有那些区别
  7. 巨头集体跨界,老玩家悄然出圈,谁在争夺6亿电竞用户?
  8. 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录-(一).doc
  9. 全球与中国飞机内部照明系统市场深度研究分析报告(2021)
  10. Python4班平均成绩统计_重磅!长春12所热门高中高考成绩全部“亮相”!你看好谁?!...