读书笔记 仅供参考

简述

Mediator 就是 仲裁者(中介者)模式。如果将程序看作许多类作为一个团队进行工作,那么团队的交流过程就是组员向仲裁者报告,仲裁者向组员下达指标,组员之间不再相互询问。

角色和 UML

Mediator

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

ConcreteMediator

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

Colleague(同事)

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

ConcreteColleague

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

UML

例子

例程是一个登录框的控制,有比较多的状态改变
大致如下图:

使用方法如下:

  • 可以选择作为游客或用户访问
  • 作为用户登录时,需要输入正常的用户名和密码
  • 点击 OK 按钮登录,点击 Cancel 按钮取消登录

状态变化如下:

  • 作为游客时,禁止用户名输入框和密码输入框
  • 作为用户时,启用用户名输入框和密码输入框
  • 如果用户输入框中没有字符,禁用密码输入框
  • 用户名输入框中有字符,启用密码输入框
  • 当用户名输入框和密码输入框中都有字符时,OK 按钮可以使用,否则不能使用
  • Cancel 按钮一直可以使用

代码

public interface Mediator {// 生成组员APIvoid createColleague();//被各个 Colleague 使用,向仲裁者报告void colleagueChanged();
}
public interface Colleague {//让组员知道仲裁者void SetMediator(Mediator mediator);//告知组员仲裁者下达的命令,在这个例子中就是启用或不启用void setColleagueEnabled(boolean enabled);
}
/登录框的按钮
public class ColleagueButton extends Button implements Colleague {private Mediator mediator;public ColleagueButton(String label) throws HeadlessException {super(label);}@Overridepublic void SetMediator(Mediator mediator) {this.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);}
}
// 登录窗口的文本框
public class ColleagueTextField extends TextField implements TextListener, Colleague {private Mediator mediator;public ColleagueTextField(String text, int columns) throws HeadlessException {super(text, columns);}@Overridepublic void SetMediator(Mediator mediator) {this.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);setBackground(enabled ? Color.WHITE : Color.lightGray);}// 当文字发生变化是通知 Meditor@Overridepublic void textValueChanged(TextEvent e) {mediator.colleagueChanged();}
}
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {private Mediator mediator;public ColleagueCheckbox(String label, CheckboxGroup group, boolean state) throws HeadlessException {super(label, group, state);}@Overridepublic void SetMediator(Mediator mediator) {this.mediator = mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);}// 状态改变时调用@Overridepublic void itemStateChanged(ItemEvent e) {mediator.colleagueChanged();}
}
// 作为仲裁者
public class LoginFrame extends Frame implements ActionListener, Mediator {private ColleagueCheckbox checkGuest;private ColleagueCheckbox checkLogin;private ColleagueTextField textUser;private ColleagueTextField textPass;private ColleagueButton buttonOk;private ColleagueButton buttonCancel;public LoginFrame(String title) throws HeadlessException {super(title);// 设置颜色setBackground(Color.lightGray);// 设置布局setLayout(new GridLayout(4, 2));// 创建组件createColleague();add(checkGuest);add(checkLogin);add(new Label("Username: "));add(textUser);add(new Label("Password: "));add(textPass);add(buttonOk);add(buttonCancel);// 设置初始状态colleagueChanged();pack();show();}@Overridepublic void createColleague() {CheckboxGroup group = new CheckboxGroup();checkGuest = new ColleagueCheckbox("Guest", group, true);checkLogin = new ColleagueCheckbox("Login", group, false);textUser = new ColleagueTextField("", 10);textPass = new ColleagueTextField("", 10);textPass.setEchoChar('*');buttonOk = new ColleagueButton("OK");buttonCancel = new ColleagueButton("Cancel");checkGuest.SetMediator(this);checkLogin.SetMediator(this);textUser.SetMediator(this);textPass.SetMediator(this);buttonCancel.SetMediator(this);buttonOk.SetMediator(this);checkGuest.addItemListener(checkGuest);checkLogin.addItemListener(checkLogin);textUser.addTextListener(textUser);textPass.addTextListener(textPass);buttonOk.addActionListener(this);buttonCancel.addActionListener(this);}@Overridepublic void colleagueChanged() {if (checkGuest.getState()) {    //游客模式textUser.setColleagueEnabled(false);textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(true);} else {                        //用户模式textUser.setColleagueEnabled(true);userpassChanged();}}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);}
}
public class Main {public static void main(String[] args) {new LoginFrame("Mediator Sample");}
}

图解设计模式- Mediator 模式相关推荐

  1. 图解设计模式-Bridge模式

    Bridge桥连接模式的作用是将两样东西链接起来,它们分别是类的功能层次结构和类的实现层次结构. 类的功能层次结构 当有一个Something类,要增加它的功能时,可以创建SomethingGood类 ...

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

    [笔记整理]图解设计模式 | 导航 定义 组员向仲裁者报告,仲裁者向组员下达指示. 当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. 当仲裁者下达指示时,组员会立即执行.团 ...

  3. 图解设计模式读书笔记(十三)——Mediator(仲裁者)模式

    使用场景: Mediator模式适用于多组件之间存在制约关系的情景.例如Gui开发中,各种组件是独立的,但开发的界面中各个组件存在制约关系.书中提到的登陆框的例子,便是这种情景. 类关系图: 仲裁者M ...

  4. 设计模式学习笔记——中介者(Mediator)模式

    设计模式学习笔记--中介者(Mediator)模式 @(设计模式)[设计模式, 中介者模式, Mediator] 设计模式学习笔记中介者Mediator模式 基本介绍 中介者案例 类图 实现代码 Me ...

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

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

  6. java mediator模式_设计模式之Mediator 中介者模式 - 解道Jdon

    设计模式目录 >> 当前页 设计模式之Mediator(中介者) 板桥里人 http://www.jdon.com 2002/05/05 Mediator中介者模式定义: 用一个中介对象来 ...

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

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

  8. 设计模式【18】——中介者模式( Mediator 模式)

    文章目录 前言 一.中介者模式( Mediator 模式) 二.具体源码 1.Colleage.h 2.Colleage.cpp 3.Mediator.h 4.Mediator.cpp 5.main. ...

  9. 设计模式--中介者(Mediator)模式

    模式定义 用一个中介对象来封装(封装变化)一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散(管理变化),而且可以独立地改变它们之间的交互 类图 应用场景 当多个对象互相关联交互并 ...

最新文章

  1. python怎么自学、可以达到什么程度-Python学到什么程度才算精通?天津Python培训...
  2. Python 技术篇-requests发送post请求传文件给flask服务端报405、400问题解决方法
  3. java 调用python脚本过程_通过Java调用Python脚本
  4. Windows 10全新界面要来了:焕然一新!
  5. leetcode1 两数之和
  6. ES6的Proxy对象
  7. java 继承对象 初始化_java中具有继承关系的类及其对象初始化顺序
  8. python内存管理错误的是_解读Python内存管理机制(转载)
  9. 51Nod-1087 1 10 100 1000【模拟】
  10. 生产者-消费者习题的运用
  11. 【转】CString 操作指南
  12. HTTP、SSL/TSL、HTTPS、TCP、UDP
  13. 使用npm安装vue项目+使用
  14. thymeleaf渲染搜索页面(template: “class path resource [templates/serach.html]“)-serach2021-09-23
  15. 电脑桌面便签软件怎么新建内容?
  16. OpenCV开发笔记(四十五):红胖子8分钟带你深入了解重映射(图文并茂+浅显易懂+程序源码)
  17. java后台 apiV3 对接微信app支付
  18. 浙江大学PAT考试基础知识整理
  19. 基于HMM的语音合成理论知识
  20. CentOS7安装MariaDB的流程步骤

热门文章

  1. java计算机毕业设计再生产公益管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  2. 测试团队建设,个人小总结~
  3. 酷派COOL20s什么时候发布 酷派COOL20s配置如何
  4. flex布局和响应式布局
  5. 单片机三角波c语言程序,三角波单独发生 单片机程序
  6. 帕德逼近matlab算法,帕德逼近matlab
  7. GUI窗口不显示图片背景图片,和布局后不显示组件,的根本原因和解决办法
  8. ABAQUS 求解应力强度因子
  9. 智能优化算法(源码)-食肉植物算法(Carnivorous Plant Algorithm ,CPA)
  10. 分享107个PHP源码,总有一款适合您