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模式(仲裁者设计模式)的更多相关文章

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

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

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

    时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...

  3. 设计模式(十六)Mediator模式

    在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...

  4. 设计模式C++描述----18.中介者(Mediator)模式

    一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...

  5. 《图解设计模式》读书笔记7-2 Mediator模式

    目录 Mediator模式简介 示例程序 示例程序类图 代码 Mediator模式角色和类图 角色 模式类图 思路拓展 简单化 角色复用 Mediator模式简介 Mediator模式即中介者模式,可 ...

  6. 十六、Mediator 仲载者设计模式

    原理: 代码清单: Mediator public interface Mediator { void createColleagues(); void colleagueChanged(); } C ...

  7. Observer模式(观察者设计模式)

    Observer 设计模式? 在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. Observer 并非主动观察,而是被动 ...

  8. 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考

    http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...

  9. Facade模式和Mediator模式

    相同的目的:把某种策略施加到另一组对象上. Facade从上面施加策略. 其使用是明显且受限的.当策略涉及范围广泛并且可见时. 约定的关注点.都同意使用Facade而不是隐藏于其下的对象. Media ...

随机推荐

  1. Gym - 100513K :Treeland (按距离还原一棵树)

    题意:一个顶点数为N的生成树,对于每个点i,我们按照与i的距离给出顺序,即dis i 1<=dis i 2<=dis i 3<=...,现在让你输出N-1条边,即还原这棵树. 思路: ...

  2. OSS阿里云文件上传 demo。

    所需jar包: aliyun-openservices-1.2.3.jar jdom-1.1.jar commons-codec-1.4.jar commons-logging-1.1.1.jar g ...

  3. bzoj 2850 巧克力王国——KDtree

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 改一下估价即可.判断子树能否整个取或者是否整个不能取,时间好像就能行了? 因为有负数, ...

  4. VS2008中宽字节和普通字节的使用

    由于麻烦,所以并没有使用宽字节,留待以后.

  5. strcmp strcpy的使用 char类型

    //判断从控制台输入的密码是否正确 BOOL varifyPassWord(char passWord[] , int index) { BOOL result = YES; int count = ...

  6. HDOJ5044(最近公共祖先)

    #include<cstdio> #include<cstring> using namespace std; ; struct Edge{ int v,id,next; }e ...

  7. 3DES加密/解密

    /// <summary> /// C#/PHP/JSP 3DES 加密与解密(只支持UTF-8编码) /// </summary> public class Crypto3D ...

  8. hive 连接查询sql对比效率

    准备4个表 从mysql 导出excel 转换为txt 创建hive 表的导入文件 create table bdqn_student( sno int, sname string, sbirthda ...

  9. RStudio 断点调试 进入for循环语句调试

    参考: http://www.rstudio.com/ide/docs/debugging/overview 1.进入调试模式 全选代码,点击source即可进入调试模式. 2.进入for 调试 在F ...

  10. R: 缺失值 & 查看变量类型

    ################################################### 问题:缺失值   18.5.2 有关处理缺失值的各种方法有什么?各自的适用场景. 解决方案: n ...