1. 程式人生 > >Mediator模式(仲裁者設計模式)

Mediator模式(仲裁者設計模式)

Mediator ?

  • Mediator的意思是“仲裁者”“中介者”。一方面,當發生麻煩事情的時候,通知仲裁者;當發生涉及全體組員的事情時,也通知仲裁者。當仲裁者下達指示時,組員會立即執行。團隊組員之間不再互相溝通並私自做出決定,而是發生任何事情都向仲裁者報告。另一方面,仲裁者站在整個團隊的角度上對組員上報的事情做出決定。這就是Mediator模式。

  • 概述: 他們(構件)各自與仲裁者通訊。然後,將控制顯示的邏輯處理交給仲裁者負責。(解決了原來邏輯分散的程式碼邏輯,控制流程比較清晰)

理清職責

|名字======》》》》說明 Mediator定義“|| 仲裁者”的介面(API)的介面 colleague ||定義“組員”的介面(APl)的介面 colleagueButton || 表示按鈕的類。它實現了Colleague介面 |ColleagueTextField || 表示文字輸入框的類。它實現了Colleague介面 colleaguecheckbox || 表示勾選框(此處是單選按鈕)的類。它實現了Colleague介面 LoginFrame || 表示登入對話方塊的類。它實現了Mediator介面 |Main || 測試程式行為的類

  • 實現功能 1.如果選擇作為遊客訪問,那麼禁用使用者名稱輸入框和密碼輸入框,使使用者無法輸入·如果選擇作為使用者登入,那麼啟用使用者名稱輸入框和密碼輸入框,使使用者可以輸入 2.如果在使用者名稱輸入框中一個字元都沒有輸入,那麼禁用密碼輸入框,使使用者無法輸入密碼 3.如果在使用者名稱輸入框中輸入了至少一個字元,那麼啟用密碼輸入框,使使用者可以輸入密碼(當然,如果選擇作為遊客訪問,那麼密碼框依然是禁用狀態) 4.只有當用戶名輸入框和密碼輸入框中都至少輸入一個字元後,OK按鈕才處於啟用狀態,可以被按下。使用者名稱輸入框或密碼輸入框中一個字元都沒有被輸入的時候,禁用OK按鈕,使其不可被按下(當然,如果選擇作為遊客訪問,那麼OK按鈕總是處於啟用狀態) 5.Cancel按鈕總是處於啟用狀態,任何時候都可以按下該按鈕

UML

時序圖:

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