设计模式学习笔记——中介者(Mediator)模式

    xiaoxiao2021-03-28  35

    设计模式学习笔记——中介者(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

    ——————参考《图解设计模式》

    转载请注明原文地址: https://ju.6miu.com/read-664782.html

    最新回复(0)