图解设计模式(十六)Mediator 模式

读书笔记 仅供参考

简述

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");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值