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. POJ1958:Strange Towers of Hanoi

    我对状态空间的理解:https://www.cnblogs.com/AKMer/p/9622590.html 题目传送门:http://poj.org/problem?id=1958 题目要我们求四柱 ...

  2. 杂项-权限管理:Spring Secutity

    ylbtech-杂项-权限管理:Spring Secutity Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在S ...

  3. Linux如何打开执行脚本

    命令行下例如要打开startmysql.sh就直接 sh /目录/目录当前界面下就简单了在这个SH文件目录下打开终端 输入 sh startmysql.sh 回车或者对这个文件右键 打开 选择“在终端 ...

  4. js---倒计时的自动跳转.html

    ============================================================================== 倒计时的自动跳转.html <!DO ...

  5. asp弹出层

    asp弹出层 <style type="text/css"> html, body { height: %; width: %; } .white_content { ...

  6. <正则吃饺子> :关于Java的native方法(转)

    感谢作者的分享,原文地址:http://blog.csdn.net/wike163/article/details/6635321 一. 什么是Native Method   简单地讲,一个Nativ ...

  7. winform 客户端采用HTTP协议与服务端通信

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  8. IOS+openCV在Xcode的入门开发

    昨天折腾了一天,终于搞定了openCV+IOS在Xcode下的环境并且实现一个基于霍夫算法的圆形识别程序.废话不多说,下面就是具体的折腾流程: ---------------------------- ...

  9. [原]toString()方法的复写作用, 以及打印集合.

    java中的每个类的根都是Object的子类. 必然有拥有了Object的所有方法. 在package java.lang.Object源码中: public String toString() { ...

  10. 关于RTC的浅学

    最近公司业务主要是移动客户端,所以免不了客户端与服务端之间的通信.第一次接触通信,做点基本概念的笔记. 主要架构是:openfire+xmpp+play+移动客户端,下文理下这几个概念. OpenFi ...