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 ...
随机推荐
- SQL Server DBA十大必备工具使生活轻松
[IT168 技术]曾经和一些DBA和数据库开发人员交流时,问他们都用过一些什么样的DB方面的工具,大部分人除了SSMS和Profile之外,基本就没有使用过 其他工具了;诚然,SSMS和Profil ...
- TYVJ 1094 矩形分割
时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 YHOI Train#4 Problem 1 描述 出于某些方面的需求,我们要把一块N×M的木板切成一个个1× ...
- Redo Log File(inactive、active)损坏,处理恢复对策
redolog的生命周期中共有四种状态:current -> 正在使用的active -> 非正在使用的,对应的Dirty Block还没有完全写入到数据文件中inactive -> ...
- 【转】Pro Android学习笔记(十一):了解Intent(中)
Intent的构成 Intent可以带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name).一个inte ...
- Golang Channel用法简编
转自:http://tonybai.com/2014/09/29/a-channel-compendium-for-golang/ 在进入正式内容前,我这里先顺便转发一则消息,那就是Golang 1. ...
- PhpStorm选中相同文字高亮
1.Setting(设置)->plugins->Browse Repositories 输入BrowseWordAtCaret 搜索,安装,然后重启: 2.Setting(设置) -> ...
- SVD实例
>> X = rand(5,7) X = 0.9797 0.1365 0.6614 0.5828 0.2259 0.2091 0.5678 0.2714 0.0118 0.2844 0.4 ...
- java 正则表达式 验证邮箱
import java.util.regex.Matcher; import java.util.regex.Pattern; public class demo1 { /**java正则表达式 * ...
- 为组件设定UI
-----------------siwuxie095 工程名:CustomizeSwing 包名:com.siwuxie095.swing 类 ...
- Robot Framework 接口自动化介绍
接口测试的重要性大家应该都清楚,就不多说了,本文中主要介绍接口测试如何在robot framework自动化测试框架中进行. 一.环境依赖 1.安装robot framework环境,本文中不做讲解 ...