• 引入中介者模式
  • 中介者模式实例
  • 中介者模式分析

引入中介者模式

大家想象一下有十个人要共同完成一个工作,他们要互相合作和沟通,并且根据对方的通知可能要改变自己的状态,但这通常会带来很多问题,流程过于复杂,使得每个人不仅要专注于自己的事情,还要与他人进行沟通,得到通知,需要兼顾很多状态的变化。这时候,我们考虑可以引入一个类似上帝视角的角色,就是引入一个中介者,他来负责接受每个人的通知,并将变化发送所需要的人去,就是要他来控制并调节工作的进度和细节,这个人往往是从整体考虑的,所以使得每个人工作者只需要考虑自己的问题,一旦有了变化,就通知仲裁者,交给仲裁者去决定就可以了。 所以最后就变成了,整个团队的交流过程,组员向中介者报告,中介者向组员下达只命令。 这在现实生活中也是常见的,每个部门通常都会有一个领导人,每个班级有一个班长,往往是班长负责接受同学们的信息,然后将上面的信息从班长这里发给同学们,这里的班长就相当于一个仲裁者,同学们就相当于组员。

这就是中介者模式的基本思想,mediator有仲裁者和中介者的意思,一方面,当麻烦事情发生的时候,通知仲裁者,当发生设计全体组员的事情时,也通知仲裁者。当仲裁者下达指示的时候,组员会立即执行。团队组员之间不再互相沟通并私自做决定,而是发生任何事情都像仲裁者报告。另一方面,仲裁者在整个团队的角度上对组员报告的事情进行决定。

中介者模式的实例

我们通过一个gui程序来实现一个简单的仲裁者模式

看上图是一个我们经常见的登录框。通常登录框就设计很多状态的变化,比如我们这个例子就要实现如下的逻辑

首先,如果选择用户登录,那么用户名输入框处于启用状态,但密码输入框处于禁用状态,如下图

如果用户输入了用户名,密码框就启用,如下图

如果又删掉了用户名,那么密码又变回禁用状态

如果选择游客登录,就都处于禁用状态。

假设我们有这样的需求,那么我们应该如何编写程序呢? 最先的想法就是,每个控件分别分别接受相关控件的状态,根据不同的状态在改变自己的状态。这样做是可以实现功能的,但是假设这时候我们新加一个控件进来,那么由于这个逻辑分散在各个控件的代码中,所以我们修改起来非常麻烦,而且每个控件都充斥着状态控制的代码,很臃肿,控件应该专注于实现自己的逻辑。 因为这些控件都相互关联,相互制约的,全部耦合在一起。 根据面向对象的设计原则,我们应该尽量对象过度耦合,实现松耦合的状态。

于是,我们就可以利用中介者模式,每个控件发生了变化,我们就把变化发给中介者,中介者统一来处理,这样控件就只需要专注于自己的实现就行了。

首先看类图:

首先,定义Mediator接口

public interface Mediator {public abstract void createColleagues();public abstract void colleagueChanged();
}复制代码

定义Colleague接口

public interface Colleague {public abstract void setMediator(Mediator mediator);public abstract void setColleagueEnabled(boolean enabled);
}复制代码

实现三个colleague类:

import java.awt.Button;public class ColleagueButton extends Button implements Colleague {private Mediator mediator;public ColleagueButton(String caption) {super(caption);}public void setMediator(Mediator mediator) {            // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用的指示 setEnabled(enabled);}
}复制代码
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {private Mediator mediator;public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {  // 构造函数 super(caption, group, state);}public void setMediator(Mediator mediator) {            // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用指示setEnabled(enabled);}public void itemStateChanged(ItemEvent e) {             // 当状态发生变化时通知Mediatormediator.colleagueChanged();}
}复制代码
import java.awt.TextField;
import java.awt.Color;
import java.awt.event.TextListener;
import java.awt.event.TextEvent;public class ColleagueTextField extends TextField implements TextListener, Colleague {private Mediator mediator;public ColleagueTextField(String text, int columns) {   // 构造函数super(text, columns);}public void setMediator(Mediator mediator) {            // 保存Mediatorthis.mediator = mediator;}public void setColleagueEnabled(boolean enabled) {      // Mediator下达启用/禁用的指示setEnabled(enabled);setBackground(enabled ? Color.white : Color.lightGray);}public void textValueChanged(TextEvent e) {             // 当文字发生变化时通知Mediatormediator.colleagueChanged();}
}复制代码

最后实现具体的中介者对象

import java.awt.Frame;
import java.awt.Label;
import java.awt.Color;
import java.awt.CheckboxGroup;
import java.awt.GridLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;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;// 构造函数。// 生成并配置各个Colleague后,显示对话框。public LoginFrame(String title) {super(title);setBackground(Color.lightGray);// 使用布局管理器生成4×2窗格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。public 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);}// 接收来自于Colleage的通知然后判断各Colleage的启用/禁用状态。public void colleagueChanged() {if (checkGuest.getState()) { // Guest modetextUser.setColleagueEnabled(false);textPass.setColleagueEnabled(false);buttonOk.setColleagueEnabled(true);} else { // Login modetextUser.setColleagueEnabled(true);userpassChanged();}}// 当textUser或是textPass文本输入框中的文字发生变化时// 判断各Colleage的启用/禁用状态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);}}public void actionPerformed(ActionEvent e) {System.out.println(e.toString());System.exit(0);}
}
复制代码

Main类

import java.awt.*;
import java.awt.event.*;public class Main {static public void main(String args[]) {new LoginFrame("Mediator Sample");}
}
复制代码

运行结果

中介者模式分析

中介者模式主要有几个角色

  • 中介者 就是负责定义控制逻辑,接受来自组员的消息并处理的接口,对应实例中的Mediator接口
  • 具体的中介者 实现接口,并根据不同的需求,做出不同的逻辑
  • 同事组员Colleague 组员的接口,定义相应的方法
  • 具体的组员 负责实现具体的组员逻辑,并将通知直接交给中介者执行

中介者模式的类图:

设计模式之中介者模式(mediator模式)相关推荐

  1. 19 C++设计模式之中介者(Mediator)模式

    文章目录 中介者(Mediator)模式定义 中介者(Mediator)模式优缺点 优点 缺点 中介者(Mediator)模式构成与实现 构成 实例 中介者(Mediator)模式定义 中介者模式(M ...

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

    1.定义 中介者模式是一种行为型模式,是为了解决对象之间错综复杂的调用关系的一种设计模式,这种错综复杂的调用关系采用一个中介类来进行帮忙调用,所有的调用者只是需要关心中介者,而不需要进行互相依赖. 例 ...

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

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

  4. c++中介者模式mediator

    中介者模式mediatorr 概念 角色和职责 模式优点 案例 概念 Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediato ...

  5. Mediator模式

    Mediator模式 Mediator模式是一种很有用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性. 面向对象设计激励将行为分布到各个对象中,但这种 ...

  6. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

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

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

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

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

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

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

最新文章

  1. Python内置数据结构之双向队列
  2. Calendar的获取变化日期
  3. python修改电脑名称_python 脚本之批量更改主机名
  4. LeetCode Algorithm 剑指 Offer 25. 合并两个排序的链表
  5. 学习一项新技能的公式
  6. uni app 调用网络打印机_uni-app 的使用体验总结
  7. MySQL集群:高可用性DBMS
  8. #include #import @class 讲解
  9. 使用getString成员函数获取表字段数据出错
  10. Linux_OpenSSH远程连接
  11. 安卓IPCamera-ONVIF JAVA代码开源啦
  12. Node Stream 入门与深入
  13. 实时视频动作检测(action detection)
  14. 谷歌支付 googleplay API权限相关设置
  15. ISP中的Lens shading整理不易
  16. Linux的任督二脉之内存管理线上微信群直播报名(2018.1.29-2.2)
  17. Python制作PPT
  18. 自动化测试处理textarea文本框
  19. WIN7中文专业版安装日文语言包的方法
  20. 51单片机点阵屏实现俄罗斯方块

热门文章

  1. Linux下Tomcat与Apache Web服务器的整合
  2. web异步开发——json
  3. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)
  4. [深度学习]实现一个博弈型的AI,从五子棋开始(1)
  5. 如何利用百度ocr实现验证码自动识别
  6. NULL,,String.Empty三者在C#中的区别
  7. 仔细学习CSS(二)
  8. Code Generate of Power Designer[转]
  9. 把伪需求扼制在摇篮里-B端产品需求方法论
  10. 百度VS谷歌?搜索质量评判也要讲基本法