Mediator模式(仲裁者设计模式)
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);
}
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public 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);
}
@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
public class ColleagueButton extends JButton implements Colleague {
private Mediator mediator;
public ColleagueButton(String text) {
super(text);
}
@Override
public void setMediator(Mediator mediator) {
this.mediator=mediator;
}
@Override
public 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);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
@Override
public 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 Mediator
checkLogin.setMediator(this);
checkGuest.setMediator(this);
textPass.setMediator(this);
textUser.setMediator(this);
buttonok.setMediator(this);
buttonCancel.setMediator(this);
// set listener
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonok.addActionListener(this);
buttonCancel.addActionListener(this);
}
@Override
public 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();
}
}
Mediator模式(仲裁者设计模式)的更多相关文章
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- 设计模式--中介(Mediator)模式
时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...
- 设计模式(十六)Mediator模式
在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...
- 设计模式C++描述----18.中介者(Mediator)模式
一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...
- 《图解设计模式》读书笔记7-2 Mediator模式
目录 Mediator模式简介 示例程序 示例程序类图 代码 Mediator模式角色和类图 角色 模式类图 思路拓展 简单化 角色复用 Mediator模式简介 Mediator模式即中介者模式,可 ...
- 十六、Mediator 仲载者设计模式
原理: 代码清单: Mediator public interface Mediator { void createColleagues(); void colleagueChanged(); } C ...
- Observer模式(观察者设计模式)
Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. Observer 并非主动观察,而是被动 ...
- 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考
http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...
- Facade模式和Mediator模式
相同的目的:把某种策略施加到另一组对象上. Facade从上面施加策略. 其使用是明显且受限的.当策略涉及范围广泛并且可见时. 约定的关注点.都同意使用Facade而不是隐藏于其下的对象. Media ...
随机推荐
- ACM学习历程—UESTC 1218 Pick The Sticks(动态规划)(2015CCPC D)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 题目大意就是求n根木棒能不能放进一个容器里,乍一看像01背包,但是容器的两端可以溢出容器,只要两端的木 ...
- ACM学习历程—UESTC 1217 The Battle of Chibi(递推 && 树状数组)(2015CCPC C)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1217 题目大意就是求一个序列里面长度为m的递增子序列的个数. 首先可以列出一个递推式p(len, i) = ...
- vs code 安装Scala
首先本机要安装scala(官网肿么下不了,CSDN上面下的): 配置scala到环境变量PATH中(Scala的根目录): VS中安装以下扩展: 1. Scala: 2. Sbt: 3. Code R ...
- LCS(最长公共子序列问题)
LCS(Longest Common Subsequence),即最长公共子序列.一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列. 原理: 事实上,最长公 ...
- 时间倒计时 JS
<div id="keleyi">Christmas Countdown</div> <script type="text/javascri ...
- Python:内置函数zip()
zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象. 这个可迭代对象可以使用循环的方式列出其元素 若多个可迭代对象的长度不一致,则所返回的 ...
- 基于STM32的三轴数字罗盘HMC5883L模块的测试
最近买了个数字罗盘模块,调通后发现很不错,非常灵敏,测试的时候精度在1°以内.连续测量模式下,最快测量.输出速率可达75hz,模块每次测量完毕并将数据更新至寄存器后,其DRDY引脚便产生一个低电平脉冲 ...
- jquery 图片轮换
jquery 图片轮换 1.下载jquery.superslide.2.1.1.js (百度搜索) 2.下载Jquery-1.4.1.js(百度搜索下载) 准备工作好了,下面开始实现 3.html & ...
- python 使用sqlite3
Sqlite是一个轻量级的数据库,类似于Access. 一. 安装 Python 2.5开始提供了对sqlite的支持,带有sqlite3库. 没有sqlite的版本需要去PySqlite主页上下载安 ...
- product of大数据平台搭建------CM 和CDH安装
一.安装说明 CM是由cloudera公司提供的大数据组件自动部署和监控管理工具,相应的和CDH是cloudera公司在开源的hadoop社区版的基础上做了商业化的封装的大数据平台. 采用离线安装模式 ...