JavaMediator模式

本文最后更新于:1 年前

只有一个仲裁者

1 - 定义”仲裁者”的接口(API)的接口

public interface Mediator {
    public abstract void createColleagues();
    public abstract void colleagueChanged();
}

2 - 定义”组员”的接口(API)的接口

public interface Colleague {
    public abstract void setMediator(Mediator mediator);
    public abstract void setColleagueEnabled(boolean enabled);
}

3 - 表示按钮的类, 它实现了Colleague接口

public class ColleagueButton extends Button implements Colleague {
    private Mediator mediator;

    public ColleagueButton(String caption) {
        super(caption);
    }

    @Override
    public void setMediator(Mediator mediator) {    // 保存Mediator
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {  // Mediator 下达启用/禁用的指示
        setEnabled(enabled);
    }
}

4 - 表示文本输入框的类, 它实现了Colleague接口

public class ColleagueTextField extends TextField implements TextListener, Colleague {
    private Mediator mediator;

    public ColleagueTextField(String text, int columns){
        super(text, columns);
    }

    @Override
    public void textValueChanged(TextEvent textEvent) { // 当文字发生改变时通知Mediator
        mediator.colleagueChanged();
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {  // Mediator 下达启用/禁用的指示
        setEnabled(enabled);
        setBackground(enabled ? Color.white : Color.lightGray);
    }
}

5 - 表示勾选框(此处是单按钮)的类, 它实现了Colleague接口

public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
    private Mediator mediator;

    public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
        super(caption, group, state);
    }

    @Override
    public void itemStateChanged(ItemEvent itemEvent) { // 当状态发生改变时通知Mediator
        mediator.colleagueChanged();
    }

    @Override
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    @Override
    public void setColleagueEnabled(boolean enabled) {  // Mediator 下达启用/禁用的指示
        setEnabled(enabled);
    }
}

6 - 表示登录对话框的类, 它实现了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.LIGHT_GRAY);
        // 使用布局管理器生成4x2的窗格
        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 actionPerformed(ActionEvent actionEvent) {
        System.out.println(actionEvent.toString());
        System.exit(0);
    }

    // 生成各个Colleague
    @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);

    }

    // 接收来自于Colleague的通知然后判断个Colleague的启用/禁用状态
    @Override
    public void colleagueChanged() {
        if(checkGuest.getState()) {
            textUser.setColleagueEnabled(false);
            textPass.setColleagueEnabled(false);
            buttonOk.setColleagueEnabled(true);
        }else {
            textUser.setColleagueEnabled(true);
            underpassChanged();
        }
    }

    // 当textUser或textPass文本输入框中的文字发生变化时
    // 判断Colleague的启用/禁用状态
    public void underpassChanged() {
        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);
        }
    }
}

7 - 表示测试程序行为的类

public class Main {
    public static void main(String[] args) {
        new LoginFrame("Mediator Sample");
    }
}

8 - 输出示例

// 具体见窗口
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=OK,
when=1601126737494,modifiers=] on button0

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!