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

  1. public interface Colleague {
  2. /**
  3. * ColleagueButton、ColleaqueTextField、ColleagueCheckbox 拿到Mediator实例的办法
  4. * @param mediator
  5. */
  6. void setMediator(Mediator mediator);
  7. /**
  8. * 控制组员的状态的方法;(前提是组件必须有这个控制器方法,
  9. * 但是在一般的GUI开发中 ,组件维护都有相应的处理办法)
  10. * 注意:如果组员有更多的状态,需要定义更多的方法
  11. * @param enabled
  12. */
  13. void setColleagueEnabled(boolean enabled);
  14. }
  15. public interface Mediator {
  16. /**
  17. * 生成需要管理的组员
  18. */
  19. void createColleagues();
  20. /**
  21. * 组员向仲裁者进行报告
  22. */
  23. void colleagueChanged();
  24. }
  • ColleagueButton ,ColleagueTextField ,ColleagueCheckBox
  1. public class ColleagueTextField extends TextField implements Colleague, TextListener {
  2. private Mediator mediator;
  3. public ColleagueTextField(String text, int columns) {
  4. super(text, columns);
  5. }
  6. @Override
  7. public void textValueChanged(TextEvent e) {
  8. mediator.colleagueChanged();
  9. }
  10. @Override
  11. public void setMediator(Mediator mediator) {
  12. this.mediator=mediator;
  13. }
  14. @Override
  15. public void setColleagueEnabled(boolean enabled) {
  16. setEnabled(enabled);
  17. }
  18. }
  19. public class ColleagueCheckBox extends JRadioButton implements ItemListener,Colleague {
  20. private Mediator mediator;
  21. public ColleagueCheckBox(String text, boolean selected) {
  22. super(text, selected);
  23. }
  24. @Override
  25. public void itemStateChanged(ItemEvent e) {
  26. mediator.colleagueChanged();
  27. }
  28. @Override
  29. public void setMediator(Mediator mediator) {
  30. this.mediator=mediator;
  31. }
  32. @Override
  33. public void setColleagueEnabled(boolean enabled) {
  34. setEnabled(enabled);
  35. }
  36. }
  37. public class ColleagueButton extends JButton implements Colleague {
  38. private Mediator mediator;
  39. public ColleagueButton(String text) {
  40. super(text);
  41. }
  42. @Override
  43. public void setMediator(Mediator mediator) {
  44. this.mediator=mediator;
  45. }
  46. @Override
  47. public void setColleagueEnabled(boolean enabled) {
  48. setEnabled(enabled);
  49. }
  50. }
  • LoginFrame
  1. public class LoginFrame extends JFrame implements ActionListener,Mediator {
  2. private ColleagueCheckBox checkGuest;
  3. private ColleagueCheckBox checkLogin;
  4. private ColleagueTextField textUser;
  5. private ColleagueTextField textPass;
  6. private ColleagueButton buttonok;
  7. private ColleagueButton buttonCancel;
  8. public LoginFrame(String title) throws HeadlessException {
  9. super(title);
  10. setBackground(Color.LIGHT_GRAY);
  11. setLocationRelativeTo(null);
  12. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  13. setLayout(new GridLayout(4,2));
  14. createColleagues();
  15. add(checkGuest);
  16. add(checkLogin);
  17. add(new JLabel("UserName"));
  18. add(textUser);
  19. add(new JLabel("PassWord"));
  20. add(textPass);
  21. add(buttonok);
  22. add(buttonCancel);
  23. colleagueChanged();
  24. pack();
  25. setEnabled(true);
  26. }
  27. @Override
  28. public void actionPerformed(ActionEvent e) {
  29. System.out.println(e.toString());
  30. System.exit(0);
  31. }
  32. @Override
  33. public void createColleagues() {
  34. ButtonGroup group = new ButtonGroup();
  35. checkGuest=new ColleagueCheckBox("Guest",true);
  36. checkLogin=new ColleagueCheckBox("Login",false);
  37. group.add(checkGuest);
  38. group.add(checkLogin);
  39. textUser=new ColleagueTextField("",10);
  40. textPass=new ColleagueTextField("",10);
  41. textPass.setEchoChar('*');
  42. buttonCancel=new ColleagueButton("Cancel");
  43. buttonok=new ColleagueButton("OK");
  44. // set Mediator
  45. checkLogin.setMediator(this);
  46. checkGuest.setMediator(this);
  47. textPass.setMediator(this);
  48. textUser.setMediator(this);
  49. buttonok.setMediator(this);
  50. buttonCancel.setMediator(this);
  51. // set listener
  52. checkGuest.addItemListener(checkGuest);
  53. checkLogin.addItemListener(checkLogin);
  54. textUser.addTextListener(textUser);
  55. textPass.addTextListener(textPass);
  56. buttonok.addActionListener(this);
  57. buttonCancel.addActionListener(this);
  58. }
  59. @Override
  60. public void colleagueChanged() {
  61. if(checkGuest.isSelected()){
  62. textPass.setEnabled(false);
  63. textUser.setEnabled(false);
  64. buttonok.setEnabled(false);
  65. }else{
  66. textUser.setColleagueEnabled(true);
  67. userpassChanged();
  68. }
  69. }
  70. private void userpassChanged() {
  71. if(textUser.getText().length()>0){
  72. textPass.setEnabled(true);
  73. if(textPass.getText().length()>0){
  74. buttonok.setEnabled(true);
  75. }else{
  76. buttonok.setEnabled(false);
  77. }
  78. }else{
  79. textPass.setEnabled(false);
  80. buttonok.setEnabled(false);
  81. }
  82. }
  83. }
  84. public class MainT {
  85. public static void main(String[] args) {
  86. LoginFrame frame = new LoginFrame("Login Test");
  87. frame.show();
  88. }
  89. }

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. Python语言及其应用 第2章

  2. bzoj 1007: [HNOI2008]水平可见直线 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=1007; 题解 其实就是求每条直线的上半部分的交 所以做裸半平面交即可 #include ...

  3. P1030 求先序排列

    题目描述 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入输出格式 输入格式: 2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序 ...

  4. shader学习推荐

    <DirectX 9.0 3D游戏开发编程基础> 当您理解了如何实现顶点着色器和像素着色器之后,接下来您可能想进一步了解使用这两种着色器能够实现哪些效果. 最好的方式就是研究一下现有的各种 ...

  5. Poj1163 The Triangle(动态规划求最大权值的路径)

    一.Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a pro ...

  6. 3 K8s安裝ELK+filebeat

    1 Filebeat: apiVersion: v1 kind: Service metadata: name: XX spec: ports: - name: http port: targetPo ...

  7. MS-SQL循环、随机数

    ---创建视图 create view myview as select re=rand() --自定义函数:取得指定范围的随机数 create function mydata( @a int, @b ...

  8. Java数组操作的10大方法

    转载自码农网 译文链接:http://www.codeceo.com/article/10-java-array-method.html 英文原文:Top 10 Methods for Java Ar ...

  9. Levenberg-Marquardt优化算法以及基于LM的BP-ANN

    一.LM最优化算法     最优化是寻找使得目标函数有最大或最小值的的参数向量.根据求导数的方法,可分为2大类.(1)若f具有解析函数形式,知道x后求导数速度快.(2)使用数值差分来求导数.根据使用模 ...

  10. 【总结整理】http-https

    上面这种加密消息的方式就是对称加密,你知道如何加密,也知道如何解码.然后李雷跟韩梅梅用的字母表偏移的加密方法叫 Caesar cipher, 凯撒加密.现实世界中用的加密算法会更复杂,但是基本原理相同 ...