图解设计模式- Mediator 模式
来源:互联网 发布:adobe xd cc mac 破解 编辑:程序博客网 时间:2024/05/04 02:03
读书笔记 仅供参考
简述
Mediator 就是 仲裁者(中介者)模式。如果将程序看作许多类作为一个团队进行工作,那么团队的交流过程就是组员向仲裁者报告,仲裁者向组员下达指标,组员之间不再相互询问。
角色和 UML
Mediator
角色负责定义与 Colleague 角色进行通信和做出决定的接口(API)。
ConcreteMediator
负责实现 Mediator 角色的接口(API)。
Colleague(同事)
负责定义与 Mediator 角色进行通信的接口。
ConcreteColleague
负责实现 Colleague 角色的接口(API)。
UML
例子
例程是一个登录框的控制,有比较多的状态改变
大致如下图:
使用方法如下:
- 可以选择作为游客或用户访问
- 作为用户登录时,需要输入正常的用户名和密码
- 点击 OK 按钮登录,点击 Cancel 按钮取消登录
状态变化如下:
- 作为游客时,禁止用户名输入框和密码输入框
- 作为用户时,启用用户名输入框和密码输入框
- 如果用户输入框中没有字符,禁用密码输入框
- 用户名输入框中有字符,启用密码输入框
- 当用户名输入框和密码输入框中都有字符时,OK 按钮可以使用,否则不能使用
- Cancel 按钮一直可以使用
代码
public interface Mediator { // 生成组员API void createColleague(); //被各个 Colleague 使用,向仲裁者报告 void colleagueChanged();}
public interface Colleague { //让组员知道仲裁者 void SetMediator(Mediator mediator); //告知组员仲裁者下达的命令,在这个例子中就是启用或不启用 void setColleagueEnabled(boolean enabled);}
/登录框的按钮public class ColleagueButton extends Button implements Colleague { private Mediator mediator; public ColleagueButton(String label) throws HeadlessException { super(label); } @Override public void SetMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); }}
// 登录窗口的文本框public class ColleagueTextField extends TextField implements TextListener, Colleague { private Mediator mediator; public ColleagueTextField(String text, int columns) throws HeadlessException { super(text, columns); } @Override public void SetMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); setBackground(enabled ? Color.WHITE : Color.lightGray); } // 当文字发生变化是通知 Meditor @Override public void textValueChanged(TextEvent e) { mediator.colleagueChanged(); }}
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague { private Mediator mediator; public ColleagueCheckbox(String label, CheckboxGroup group, boolean state) throws HeadlessException { super(label, group, state); } @Override public void SetMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); } // 状态改变时调用 @Override public void itemStateChanged(ItemEvent e) { mediator.colleagueChanged(); }}
// 作为仲裁者public class LoginFrame extends Frame 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.lightGray); // 设置布局 setLayout(new GridLayout(4, 2)); // 创建组件 createColleague(); add(checkGuest); add(checkLogin); add(new Label("Username: ")); add(textUser); add(new Label("Password: ")); add(textPass); add(buttonOk); add(buttonCancel); // 设置初始状态 colleagueChanged(); pack(); show(); } @Override public void createColleague() { CheckboxGroup group = new CheckboxGroup(); checkGuest = new ColleagueCheckbox("Guest", group, true); checkLogin = new ColleagueCheckbox("Login", group, false); textUser = new ColleagueTextField("", 10); textPass = new ColleagueTextField("", 10); textPass.setEchoChar('*'); buttonOk = new ColleagueButton("OK"); buttonCancel = new ColleagueButton("Cancel"); checkGuest.SetMediator(this); checkLogin.SetMediator(this); textUser.SetMediator(this); textPass.SetMediator(this); buttonCancel.SetMediator(this); buttonOk.SetMediator(this); checkGuest.addItemListener(checkGuest); checkLogin.addItemListener(checkLogin); textUser.addTextListener(textUser); textPass.addTextListener(textPass); buttonOk.addActionListener(this); buttonCancel.addActionListener(this); } @Override public void colleagueChanged() { if (checkGuest.getState()) { //游客模式 textUser.setColleagueEnabled(false); textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(true); } else { //用户模式 textUser.setColleagueEnabled(true); userpassChanged(); } } private void userpassChanged() { if (textUser.getText().length() > 0) { textPass.setColleagueEnabled(true); if (textPass.getText().length() > 0) { buttonOk.setColleagueEnabled(true); } else { buttonOk.setColleagueEnabled(false); } } else { textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(false); } } @Override public void actionPerformed(ActionEvent e) { System.out.println(e.toString()); System.exit(0); }}
public class Main { public static void main(String[] args) { new LoginFrame("Mediator Sample"); }}
阅读全文
0 0
- 图解设计模式- Mediator 模式
- [设计模式]Mediator模式
- 设计模式之Mediator
- 设计模式之 mediator
- Mediator-----设计模式
- JAVA设计模式-Mediator
- 设计模式笔记-Mediator
- 设计模式之mediator模式
- 设计模式之Mediator模式
- 设计模式学习16 Mediator
- 笔记:Gof设计模式--Mediator
- 【设计模式】之十Mediator
- Mediator(中介者)设计模式
- 设计模式(十三)mediator
- 设计模式简单代码之Mediator模式
- 设计模式(19)-中介者模式(Mediator)
- 设计模式之Mediator中介者模式
- 设计模式----Mediator(中介者)模式
- JavaFX控件——FileChooser(文件选择框)
- $http协议以及常用状态码
- 华山论剑之程序员高手们
- 招工作的辛苦历程—国企事业单位篇
- 哈尔滨理工大学第七届程序设计竞赛初赛(高年级组)D 经商【并查集+0-1背包】
- 图解设计模式- Mediator 模式
- Google ARCore 学习——ARCore与人脸识别相结合
- File协议
- maven安装并在eclipse中配置
- Python报错的解决方案(持续更新)
- 鲁宾逊的伟大历史贡献
- 正确理解ThreadLocal
- numpy:np.random.randn
- RDF数据库Stardog安装(Ubuntu)