设计模式学习笔记——中介者(Mediator)模式
2017-04-13 10:40
891 查看
设计模式学习笔记——中介者(Mediator)模式
@(设计模式)[设计模式, 中介者模式, Mediator]设计模式学习笔记中介者Mediator模式
基本介绍
中介者案例
类图
实现代码
Mediator接口
Colleague接口
ColleagueButton类
ColleagueTextField类
ColleagueCheckbox类
LoginFrame类
测试类
运行结果
中介者模式中的角色
Mediator仲裁者中介者
ConcreteMediator具体的仲裁者中介者
Colleague同事
ConcreteColleague 具体的同事
类图
基本介绍
中介者模式一般用于调整多个对象之间的关系,当对象状态改变时,将信息先传递给中介者,中介者进行处理,再反馈给相应的对象。中介者案例
类图
实现代码
Mediator接口
package com.pc.mediator.example; /** * 中介者接口 * Created by Switch on 2017/3/30. */ public interface Mediator { /** * 创建中介者管理成员 */ void createColleagues(); /** * 成员状态改变 */ void colleagueChanged(); }
Colleague接口
package com.pc.mediator.example; /** * 成员接口 * Created by Switch on 2017/3/30. */ public interface Colleague { /** * 设置中介者 * * @param mediator 中介者对象 */ void setMediator(Mediator mediator); /** * 设置成员状态 * * @param enabled 启用true,不启用false */ void setColleagueEnabled(boolean enabled); }
ColleagueButton类
package com.pc.mediator.example; import java.awt.Button; /** * 按钮成员类 * Created by Switch on 2017/3/30. */ public class ColleagueButton extends Button implements Colleague { /** * 中介者 */ private Mediator mediator; /** * 构造方法,设置标题 * * @param caption 标题 */ public ColleagueButton(String caption) { super(caption); } @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); } }
ColleagueTextField类
package com.pc.mediator.example; import java.awt.TextField; import java.awt.Color; import java.awt.event.TextEvent; import java.awt.event.TextListener; /** * 文本域成员类 * Created by Switch on 2017/3/30. */ public class ColleagueTextField extends TextField implements TextListener, Colleague { /** * 中介者 */ private Mediator mediator; /** * 构造方法,设置文本和字数 * * @param text 文本 * @param wordNumber 字数 */ public ColleagueTextField(String text, int wordNumber) { super(text, wordNumber); } @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); setBackground(enabled ? Color.white : Color.lightGray); } /** * 当文字发生变化时通知Mediator * * @param e 文本事件 */ @Override public void textValueChanged(TextEvent e) { mediator.colleagueChanged(); } }
ColleagueCheckbox类
package com.pc.mediator.example; import java.awt.Checkbox; import java.awt.CheckboxGroup; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; /** * 复选框成员类 * Created by Switch on 2017/3/30. */ public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague { /** * 中介者 */ private Mediator mediator; /** * 构造方法,设置复选框标题、组、初始状态 * * @param caption 标题 * @param group 组 * @param state 初始状态 */ public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) { super(caption, group, state); } @Override public void setMediator(Mediator mediator) { this.mediator = mediator; } @Override public void setColleagueEnabled(boolean enabled) { setEnabled(enabled); } /** * 当状态发生变化时通知Mediator * * @param e 选项事件 */ @Override public void itemStateChanged(ItemEvent e) { mediator.colleagueChanged(); } }
LoginFrame类
package com.pc.mediator.example; import java.awt.Frame; import java.awt.Label; import java.awt.GridLayout; import java.awt.Color; import java.awt.CheckboxGroup; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 登录界面类 * Created by Switch on 2017/3/30. */ 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; /** * 构造方法,设置标题 * * @param title 标题 */ 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(); } @Override 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); } @Override 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); } } @Override public void actionPerformed(ActionEvent e) { System.out.println(e.toString()); System.exit(0); } }
测试类
package com.pc.mediator.example.test; import com.pc.mediator.example.LoginFrame; import org.junit.Test; /** * LoginFrame Tester. * * @author Switch * @version 1.0 */ public class LoginFrameTest { /** * 测试中介者模式 * * @throws InterruptedException 中断异常 */ @Test public void testLoginFrame() throws InterruptedException { new LoginFrame("Mediator Sample"); Thread.sleep(100000); } }
运行结果
中介者模式中的角色
Mediator(仲裁者、中介者)
Mediator角色负责定义与
Colleague角色进行通信和做出决定的接口(
API)。在案例中,由
Mediator接口扮演此角色。
ConcreteMediator(具体的仲裁者、中介者)
ConcreteMediator角色负责实现
Mediator角色的接口(
API),负责实际做出决定。在案例中,由
LoginFrame类扮演此角色。
Colleague(同事)
Colleague角色负责定义与
Mediator角色进行通信的接口(
API)。在案例中,由
Colleague接口扮演此角色。
ConcreteColleague (具体的同事)
ConcreteColleague角色负责实现
Colleague角色的接口(
API)。在案例中,由
ColleagueButton类、
ColleagueTextField类和
ColleagueCheckbox类扮演此角色。
类图
GitHub:DesignPatternStudy
——————参考《图解设计模式》
相关文章推荐
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记--Mediator 中介者模式
- HeadFirst 设计模式学习笔记18--中介者(Mediator)模式拾零
- 【设计模式学习笔记十八】【行为模式】【中介者模式(Mediator)】
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 步步为营 .NET 设计模式学习笔记 二十、Mediator(中介者模式)
- 设计模式学习笔记--中介者模式Mediator pattern(Java版)
- 【HeadFirst 设计模式学习笔记】17 中介者(Mediator)模式拾零
- 设计模式学习笔记十八:中介者模式
- 设计模式学习笔记之中介者模式
- 设计模式 笔记 中介者模式 Mediator
- 【学习笔记javascript设计模式与开发实践(中介者模式)----14】
- 设计模式 笔记 中介者模式 Mediator
- [设计模式笔记]三. 行为型模式--19. Mediator模式(中介者)对象行为型模式(一)
- java学习笔记-设计模式23(中介者模式)
- HeadFir st 设计模式学习笔记18--中介者(M ediator)模式拾零
- 设计模式学习—Mediator(中介者)
- 设计模式学习笔记2:说说Mediator模式
- 设计模式学习—Mediator(中介者)
- GoF设计模式学习笔记 第一回 Mediator