设计模式(十六)-中介者模式(Mediator Pattern)——只有一个仲裁者
2018-02-07 09:39
555 查看
中介者模式(Mediator Pattern)中,组员向仲裁者报告,仲裁者向组员下达指示。
Mediator.java
略
总结:
应用实例:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。2、机场调度系统。3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
使用场景:1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:不应当在职责混乱的时候使用。
Mediator.java
package com.test.dp.Mediator.Sample; //定义“仲裁者”的接口(API)的接口 public interface Mediator { public abstract void createColleagues(); public abstract void colleagueChanged(); }Colleague.java
package com.test.dp.Mediator.Sample; //定义“组员”的接口(API)的接口 public interface Colleague { public abstract void setMediator(Mediator mediator); public abstract void setColleagueEnabled(boolean enabled); }ColleagueButton.java
package com.test.dp.Mediator.Sample; import java.awt.Button; //表示按钮的类。实现了Colleague接口 public class ColleagueButton extends Button implements Colleague { private Mediator mediator; public ColleagueButton(String caption) { super(caption); } public void setMediator(Mediator mediator) { // 保存Mediator this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { // Mediator下达启用/禁用的指示 setEnabled(enabled); } }ColleagueTextField.java
package com.test.dp.Mediator.Sample; import java.awt.TextField; import java.awt.Color; import java.awt.event.TextListener; import java.awt.event.TextEvent; //表示文本输入框的类。实现了Colleague接口 public class ColleagueTextField extends TextField implements TextListener, Colleague { private Mediator mediator; public ColleagueTextField(String text, int columns) { // 构造函数 super(text, columns); } public void setMediator(Mediator mediator) { // 保存Mediator this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { // Mediator下达启用/禁用的指示 setEnabled(enabled); setBackground(enabled ? Color.white : Color.lightGray); } public void textValueChanged(TextEvent e) { // 当文字发生变化时通知Mediator mediator.colleagueChanged(); } }ColleagueCheckbox.java
package com.test.dp.Mediator.Sample; import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.event.ItemListener; import java.awt.event.ItemEvent; //表示勾选框(此处时单选按钮)的类。实现了Colleague接口 public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague { private Mediator mediator; public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) { // 构造函数 super(caption, group, state); } public void setMediator(Mediator mediator) { // 保存Mediator this.mediator = mediator; } public void setColleagueEnabled(boolean enabled) { // Mediator下达启用/禁用指示 setEnabled(enabled); } public void itemStateChanged(ItemEvent e) { // 当状态发生变化时通知Mediator mediator.colleagueChanged(); } }LoginFrame.java
package com.test.dp.Mediator.Sample; import java.awt.Frame; import java.awt.Label; import java.awt.Color; import java.awt.CheckboxGroup; import java.awt.GridLayout; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; //表示登录对话框的类。实现了Mediator接口 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; // 构造函数。 // 生成并配置各个Colleague后,显示对话框。 public LoginFrame(String title) { super(title); setBackground(Color.lightGray); // 使用布局管理器生成4×2窗格 setLayout(new GridLayout(4, 2)); // 生成各个Colleague createColleagues(); // 配置 add(checkGuest); add(checkLogin); add(new Label("Username:")); add(textUser); add(new Label("Password:")); add(textPass); add(buttonOk); add(buttonCancel); // 设置初始的启用起用/禁用状态 colleagueChanged(); // 显示 pack(); show(); } // 生成各个Colleague。 public void createColleagues() { // 生成 CheckboxGroup g = new CheckboxGroup(); checkGuest = new ColleagueCheckbox("Guest", g, true); checkLogin = new ColleagueCheckbox("Login", g, false); textUser = new ColleagueTextField("", 10); textPass = new ColleagueTextField("", 10); textPass.setEchoChar('*'); buttonOk = new ColleagueButton("OK"); buttonCancel = new ColleagueButton("Cancel"); // 设置Mediator checkGuest.setMediator(this); checkLogin.setMediator(this); textUser.setMediator(this); textPass.setMediator(this); buttonOk.setMediator(this); buttonCancel.setMediator(this); // 设置Listener checkGuest.addItemListener(checkGuest); checkLogin.addItemListener(checkLogin); textUser.addTextListener(textUser); textPass.addTextListener(textPass); buttonOk.addActionListener(this); buttonCancel.addActionListener(this); } // 接收来自于Colleage的通知然后判断各Colleage的启用/禁用状态。 public void colleagueChanged() { if (checkGuest.getState()) { // Guest mode textUser.setColleagueEnabled(false); textPass.setColleagueEnabled(false); buttonOk.setColleagueEnabled(true); } else { // Login mode textUser.setColleagueEnabled(true); userpassChanged(); } } // 当textUser或是textPass文本输入框中的文字发生变化时 // 判断各Colleage的启用/禁用状态 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); } } public void actionPerformed(ActionEvent e) { System.out.println(e.toString()); System.exit(0); } }Main.java
package com.test.dp.Mediator.Sample; import java.awt.*; import java.awt.event.*; public class Main { static public void main(String args[]) { new LoginFrame("Mediator Sample"); } }执行结果:
略
总结:
应用实例:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。2、机场调度系统。3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点:1、降低了类的复杂度,将一对多转化成了一对一。2、各个类之间的解耦。3、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
使用场景:1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项:不应当在职责混乱的时候使用。
相关文章推荐
- 中介者(Mediator)模式--------------只有一个仲裁者
- 设计模式(18)——中介者模式(Mediator Pattern)
- 中介者模式(Mediator Pattern)
- 二十四种设计模式:中介者模式(Mediator Pattern)
- JAVA设计模式之 中介者模式【Mediator Pattern】
- 中介者模式(Mediator Pattern)
- 中介者模式(Mediator pattern)
- 中介者模式(Mediator Pattern)
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
- 18.中介者模式(Mediator Pattern)
- 4.7 《硬啃设计模式》 第24章 麻烦的多角关系 - 中介者模式(Mediator Pattern)简介
- 中介者模式(Mediator Pattern)
- 设计模式21 - 中介者模式【【Mediator Pattern】
- 中介者模式(Mediator Pattern)
- 设计模式之中介者模式(Mediator Pattern)
- 设计模式读书笔记之中介者模式(mediator pattern)
- C#设计模式之十七中介者模式(Mediator Pattern)【行为型】
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
- 我所理解的设计模式(C++实现)——中介者模式(Mediator Pattern)
- 中介者模式(Mediator Pattern)