Mediator ?

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

  • 概述:
    他们(构件)各自与仲裁者通信。然后,将控制显示的逻辑处理交给仲裁者负责。(解决了原来逻辑分散的代码逻辑,控制流程比较清晰)

理清职责

|名字======》》》》说明
Mediator定义“|| 仲裁者”的接口(API)的接口
colleague ||定义“组员”的接口(APl)的接口
colleagueButton || 表示按钮的类。它实现了Colleague接口
|ColleagueTextField || 表示文本输入框的类。它实现了Colleague接口
colleaguecheckbox || 表示勾选框(此处是单选按钮)的类。它实现了Colleague接口
LoginFrame || 表示登录对话框的类。它实现了Mediator接口
|Main || 测试程序行为的类

  • 实现功能
    1.如果选择作为游客访问,那么禁用用户名输入框和密码输入框,使用户无法输入·如果选择作为用户登录,那么启用用户名输入框和密码输入框,使用户可以输入
    2.如果在用户名输入框中一个字符都没有输入,那么禁用密码输入框,使用户无法输入密码
    3.如果在用户名输入框中输入了至少一个字符,那么启用密码输入框,使用户可以输入密码(当然,如果选择作为游客访问,那么密码框依然是禁用状态)
    4.只有当用户名输入框和密码输入框中都至少输入一个字符后,OK按钮才处于启用状态,可以被按下。用户名输入框或密码输入框中一个字符都没有被输入的时候,禁用OK按钮,使其不可被按下(当然,如果选择作为游客访问,那么OK按钮总是处于启用状态)
    5.Cancel按钮总是处于启用状态,任何时候都可以按下该按钮

UML

时序图:

Code

  • Mediator,Colleague

public interface Colleague {/*** ColleagueButton、ColleaqueTextField、ColleagueCheckbox 拿到Mediator实例的办法* @param mediator*/void setMediator(Mediator mediator);/*** 控制组员的状态的方法;(前提是组件必须有这个控制器方法,* 但是在一般的GUI开发中 ,组件维护都有相应的处理办法)* 注意:如果组员有更多的状态,需要定义更多的方法* @param enabled*/void setColleagueEnabled(boolean enabled);
}public interface Mediator {/*** 生成需要管理的组员*/void createColleagues();/*** 组员向仲裁者进行报告*/void colleagueChanged();}
  • ColleagueButton ,ColleagueTextField ,ColleagueCheckBox
public class ColleagueTextField extends TextField implements Colleague, TextListener {private Mediator mediator;public ColleagueTextField(String text, int columns) {super(text, columns);}@Overridepublic void textValueChanged(TextEvent e) {mediator.colleagueChanged();}@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);}
}public class ColleagueCheckBox extends JRadioButton implements ItemListener,Colleague {private Mediator mediator;public ColleagueCheckBox(String text, boolean selected) {super(text, selected);}@Overridepublic void itemStateChanged(ItemEvent e) {mediator.colleagueChanged();}@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);}
}public class ColleagueButton extends JButton implements Colleague {private  Mediator mediator;public ColleagueButton(String text) {super(text);}@Overridepublic void setMediator(Mediator mediator) {this.mediator=mediator;}@Overridepublic void setColleagueEnabled(boolean enabled) {setEnabled(enabled);}
}
  • LoginFrame
public class LoginFrame extends JFrame 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.LIGHT_GRAY);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(new GridLayout(4,2));createColleagues();add(checkGuest);add(checkLogin);add(new JLabel("UserName"));add(textUser);add(new JLabel("PassWord"));add(textPass);add(buttonok);add(buttonCancel);colleagueChanged();pack();setEnabled(true);}@Overridepublic void actionPerformed(ActionEvent e) {System.out.println(e.toString());System.exit(0);}@Overridepublic void createColleagues() {ButtonGroup group = new ButtonGroup();checkGuest=new ColleagueCheckBox("Guest",true);checkLogin=new ColleagueCheckBox("Login",false);group.add(checkGuest);group.add(checkLogin);textUser=new ColleagueTextField("",10);textPass=new ColleagueTextField("",10);textPass.setEchoChar('*');buttonCancel=new ColleagueButton("Cancel");buttonok=new ColleagueButton("OK");// set MediatorcheckLogin.setMediator(this);checkGuest.setMediator(this);textPass.setMediator(this);textUser.setMediator(this);buttonok.setMediator(this);buttonCancel.setMediator(this);// set listenercheckGuest.addItemListener(checkGuest);checkLogin.addItemListener(checkLogin);textUser.addTextListener(textUser);textPass.addTextListener(textPass);buttonok.addActionListener(this);buttonCancel.addActionListener(this);}@Overridepublic void colleagueChanged() {if(checkGuest.isSelected()){textPass.setEnabled(false);textUser.setEnabled(false);buttonok.setEnabled(false);}else{textUser.setColleagueEnabled(true);userpassChanged();}}private void userpassChanged() {if(textUser.getText().length()>0){textPass.setEnabled(true);if(textPass.getText().length()>0){buttonok.setEnabled(true);}else{buttonok.setEnabled(false);}}else{textPass.setEnabled(false);buttonok.setEnabled(false);}}
}public class MainT {public static void main(String[] args) {LoginFrame frame = new LoginFrame("Login Test");frame.show();}
}

转载于:https://www.cnblogs.com/dgwblog/p/9863701.html

Mediator模式(仲裁者设计模式)相关推荐

  1. 【Mediator模式】C++设计模式——中介者模式

    中介者模式 一.设计流程探讨 二.模式介绍 三.代码实现     C++设计模式大全,23种设计模式合集详解-

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

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

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

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

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

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

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

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

  6. 设计模式之中介者模式(mediator模式)

    引入中介者模式 中介者模式实例 中介者模式分析 引入中介者模式 大家想象一下有十个人要共同完成一个工作,他们要互相合作和沟通,并且根据对方的通知可能要改变自己的状态,但这通常会带来很多问题,流程过于复 ...

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

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

  8. 图解设计模式- Mediator 模式

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

  9. Mediator(仲裁者)模式

    16.1 Mediator 模式   大家想象一下一个乱糟糟的开发小组的工作状态.小组中的 10 个成员虽然一起协同工作,但是意见难以统一,总是互相指挥,导致工作进度始终滞后.他们还都十分在意编码细节 ...

最新文章

  1. 零基础入门NLP - 新闻文本分类
  2. Android PathDashPathEffect 使用详解
  3. ubuntu运行Faster R-CNN
  4. Django——2 路由分配设置 re_path正则匹配 include总路由 url传参 name使用 模板渲染render方法 模板渲染方法...
  5. Comments on task “Smart Service II: Wrap up and make it ready for Demo“
  6. python审计分析_【干货】Python自动化审计及实现
  7. USACO / Factorials (简单模拟)
  8. CentOS 7 搭建GlusterFS
  9. 【阿圆总结】关于平时阅读的推荐
  10. mysql 查询 int类型日期转换成datetime类型
  11. 搜索引擎优化(SEO,Search Engine Optimization)如何让你的网站靠前排名
  12. Internet Explorer 10 的 User-Agent 字符串
  13. 使用Robotframework-ride,导入Selenium2Library库后缺少“Open Browser”关键字
  14. 单核CPU破解后量子加密候选算法只需一小时
  15. Resource Hacker(可以修改.exe文件)
  16. 新浪动作挺快,开始再博客投广告了
  17. python创建person类_Python类与方法的私有化
  18. android banner图片错位,android轮播图Banner的使用及详解
  19. DeepFashion2: 一个针对衣服图片的检测、姿态估计、分割和重认证多用途基准
  20. Dubbo是什么?能做什么?架构图?

热门文章

  1. Xcode 模拟器如何录屏
  2. flutter 修改iOS app图标 名称
  3. tensor如何实现转置_转置()TensorFlow中的函数
  4. 色即是空之临时演员[韩国]
  5. JAVA毕业设计vue健康餐饮管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  6. windows分类及安装
  7. Marvell 88E1111PHY芯片简介
  8. android 获取build,分析,读取 android build.prop
  9. 信息收集之通过JS拓展信息面
  10. 邮箱邀请涵wm05.html文件怎么阅读,群邮箱里发来的“邀请函”暗藏木马,千万别点后面的链接...