图解设计模式- 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");    }}