Mediator模式(仲裁者设计模式)

时间:2022-10-01 23:22:38

Mediator ?

  • Mediator的意思是“仲裁者”“中介者”。一方面,当发生麻烦事情的时候,通知仲裁者;当发生涉及全体组员的事情时,也通知仲裁者。当仲裁者下达指示时,组员会立即执行。团队组员之间不再互相沟通并私自做出决定,而是发生任何事情都向仲裁者报告。另一方面,仲裁者站在整个团队的角度上对组员上报的事情做出决定。这就是Mediator模式。
    Mediator模式(仲裁者设计模式)

  • 概述:
    他们(构件)各自与仲裁者通信。然后,将控制显示的逻辑处理交给仲裁者负责。(解决了原来逻辑分散的代码逻辑,控制流程比较清晰)

理清职责

|名字======》》》》说明
Mediator定义“|| 仲裁者”的接口(API)的接口
colleague ||定义“组员”的接口(APl)的接口
colleagueButton || 表示按钮的类。它实现了Colleague接口
|ColleagueTextField || 表示文本输入框的类。它实现了Colleague接口
colleaguecheckbox || 表示勾选框(此处是单选按钮)的类。它实现了Colleague接口
LoginFrame || 表示登录对话框的类。它实现了Mediator接口
|Main || 测试程序行为的类
Mediator模式(仲裁者设计模式)

  • 实现功能
    1.如果选择作为游客访问,那么禁用用户名输入框和密码输入框,使用户无法输入·如果选择作为用户登录,那么启用用户名输入框和密码输入框,使用户可以输入
    2.如果在用户名输入框中一个字符都没有输入,那么禁用密码输入框,使用户无法输入密码
    3.如果在用户名输入框中输入了至少一个字符,那么启用密码输入框,使用户可以输入密码(当然,如果选择作为游客访问,那么密码框依然是禁用状态)
    4.只有当用户名输入框和密码输入框中都至少输入一个字符后,OK按钮才处于启用状态,可以被按下。用户名输入框或密码输入框中一个字符都没有被输入的时候,禁用OK按钮,使其不可被按下(当然,如果选择作为游客访问,那么OK按钮总是处于启用状态)
    5.Cancel按钮总是处于启用状态,任何时候都可以按下该按钮

UML

Mediator模式(仲裁者设计模式)

时序图:

Mediator模式(仲裁者设计模式)

Code

  • Mediator,Colleague

public interface Colleague {

    /**
     * ColleagueButton、ColleaqueTextField、ColleagueCheckbox 拿到Mediator实例的办法
     * @param mediator
     */
    void setMediator(Mediator mediator);

    /**
     * 控制组员的状态的方法;(前提是组件必须有这个控制器方法,
     * 但是在一般的GUI开发中 ,组件维护都有相应的处理办法)
     * 注意:如果组员有更多的状态,需要定义更多的方法
     * @param enabled
     */
    void setColleagueEnabled(boolean enabled);
}

public interface Mediator {

    /**
     * 生成需要管理的组员
     */
     void createColleagues();

    /**
     * 组员向仲裁者进行报告
     */
    void colleagueChanged();


}

  • ColleagueButton ,ColleagueTextField ,ColleagueCheckBox
public class ColleagueTextField extends TextField implements Colleague, TextListener {

    private Mediator mediator;

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

    @Override
    public void textValueChanged(TextEvent e) {
           mediator.colleagueChanged();
    }

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

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }
}

public class ColleagueCheckBox extends JRadioButton implements ItemListener,Colleague {

    private Mediator mediator;

    public ColleagueCheckBox(String text, boolean selected) {
        super(text, selected);
    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        mediator.colleagueChanged();
    }

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

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }
}

public class ColleagueButton extends JButton implements Colleague {

    private  Mediator mediator;

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

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

    @Override
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }
}

  • LoginFrame
public class LoginFrame extends JFrame 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.LIGHT_GRAY);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new GridLayout(4,2));

        createColleagues();

        add(checkGuest);
        add(checkLogin);
        add(new JLabel("UserName"));
        add(textUser);
        add(new JLabel("PassWord"));
        add(textPass);
        add(buttonok);
        add(buttonCancel);

        colleagueChanged();

        pack();
        setEnabled(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println(e.toString());
        System.exit(0);
    }

    @Override
    public void createColleagues() {
        ButtonGroup group = new ButtonGroup();
        checkGuest=new ColleagueCheckBox("Guest",true);
        checkLogin=new ColleagueCheckBox("Login",false);
        group.add(checkGuest);
        group.add(checkLogin);

        textUser=new ColleagueTextField("",10);
        textPass=new ColleagueTextField("",10);
        textPass.setEchoChar('*');


        buttonCancel=new ColleagueButton("Cancel");
        buttonok=new ColleagueButton("OK");
        // set Mediator
        checkLogin.setMediator(this);
        checkGuest.setMediator(this);
        textPass.setMediator(this);
        textUser.setMediator(this);
        buttonok.setMediator(this);
        buttonCancel.setMediator(this);
        // set 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.isSelected()){
            textPass.setEnabled(false);
            textUser.setEnabled(false);
            buttonok.setEnabled(false);
        }else{
            textUser.setColleagueEnabled(true);
            userpassChanged();
        }
    }

    private void userpassChanged() {
        if(textUser.getText().length()>0){
            textPass.setEnabled(true);
            if(textPass.getText().length()>0){
                buttonok.setEnabled(true);
            }else{
                buttonok.setEnabled(false);
            }
        }else{
            textPass.setEnabled(false);
            buttonok.setEnabled(false);
        }

    }
}

public class MainT {

    public static void main(String[] args) {
        LoginFrame frame = new LoginFrame("Login Test");
        frame.show();
    }
}