【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)
【笔记整理】图解设计模式 | 导航
定义
- 组员向仲裁者报告,仲裁者向组员下达指示。
- 当发生麻烦事情的时候,通知仲裁者;当发生涉及全体组员的事情时,也通知仲裁者。
- 当仲裁者下达指示时,组员会立即执行。团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向仲裁者报告。
- 另一方面,仲裁者站在整个团队的角度上对组员上报的事情做出决定。
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模式(只有一个仲裁者)相关推荐
- 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)
[笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- 第 16 章 模板方法模式
第 16 章 模板方法模式 1.豆浆制作问题 编写制作豆浆的程序, 说明如下: 制作豆浆的流程:选材->添加配料->浸泡->放到豆浆机打碎 通过添加不同的配料, 可以制作出不同口味的 ...
- SaaS模式、技术与案例详解——第16章 SaaS模式可行性分析
[本章导读语] 模型可以澄清相互间的关系,识别出关键元素,有意识地减少可能 引起的混淆. ________凯文.福斯伯格,<可视化项目管理> SaaS系统包括SaaS平台及应用系统,Saa ...
- 【设计模式】第二章 代理模式
第二章 代理模式 文章目录 第二章 代理模式 一.简介 一.静态代理 二.动态代理 1.JDK 代理 2.CGLib 代理 三.总结 一.简介 你可能会对这个设计模式感到陌生,但是你对 Spring ...
- 23种设计模式(第二章创建者模式5种)
第二章创建者模式 单例模式 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类对外提供一个访问该单例的全局访问点. 单例模式的实现 单例设计模式分类两种: ...
- 大战设计模式【16】—— 桥接模式
桥接模式(Bridge) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 将抽象部分与其实现部分分离,使得他 ...
- 设计模式--第七章 克隆模式
第七章 克隆模式 1. 核心思想 2. UML类图 3. 框架代码 4. 优缺点 5. 应用场景 1. 核心思想 用原型实例指定要创建对象的种类,并通过拷贝这些原型的属性来创建新的对象. 通过拷贝自身 ...
- 中介者(Mediator)模式--------------只有一个仲裁者
>>组员向仲裁者报告,仲裁者向组员下达指示.组员之间不再相互 询问和相互指示. >>在该模式中:一方面,当发生麻烦事情的时候,通知仲裁者:当 发生涉及全体组员的事情时,也通知仲 ...
最新文章
- Redis 那些故障转移、高可用方案
- error C4668: 没有将“_WIN32_WINNT_WIN10_TH2”定义为预处理器宏,用“0”替换“#if/#elif”
- 【Android开发】NDK开发(1)-Hello World!
- python asyncio 并发编程_asyncio并发编程
- 初学python之列表
- python2 md5加密_Python的加密方式:MD5加密
- 与以太坊同源异流,eCash“PoW+雪崩”组合共识各司其职
- 树莓派4b安装win11/10过程全教程(附蓝屏inaccessible boot device解决办法)
- 基于Python的离线OCR图片文字识别(三)——支持PDF文件
- max232c语言,串行口通信(STC89C52+MAX232):串行口通信硬件设计详解
- python绘制动态心电图_东软医院收费端使用手册.doc
- 大数据 端到端_成为数据科学家的端到端指南
- config语言和config.in文件
- 卡巴斯基公布财报,2020年业务稳定增长
- 深度学习目标检测最全综述
- ls -la /usr/home/guest/ | more
- 基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化(Matlab代码实现)
- 3DMAX高级光照相关的名词解释
- 简单U盘修复工具(SURT).hta
- Image加载二进制数据图片
热门文章
- P1757 通天之分组背包 (分组背包 模板
- React回调函数两种常用方式
- js 中编码(encode)和解码(decode)的三种方法(传递是特殊符号丢失问题,如‘+’)
- Huawei 华为云 机器翻译调用 详解
- Elasticsearch实现类百度搜索引擎搜索功能ES5.5.0v
- 服务器独享宽带和共享宽带有那些区别
- 巨头集体跨界,老玩家悄然出圈,谁在争夺6亿电竞用户?
- 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录-(一).doc
- 全球与中国飞机内部照明系统市场深度研究分析报告(2021)
- Python4班平均成绩统计_重磅!长春12所热门高中高考成绩全部“亮相”!你看好谁?!...