圖解設(shè)計(jì)模式--Mediator(仲裁者)模式

只有一個(gè)仲裁者

Mediator 模式

組員向仲裁者報(bào)告,仲裁者向組員下達(dá)指示,組員之間不在相互詢問和相互指示。

要調(diào)整多個(gè)對(duì)象之間的關(guān)系時(shí),就需要用到 Mediator 模式。將邏輯處理交給仲裁者執(zhí)行。

示例程序

名字 說明 角色
Mediator 定義“仲裁者”的接口的接口 Mediator
Colleague 定義“組員”的接口的接口 Colleague
ColleagueButton 表示按鈕的類。它實(shí)現(xiàn)了 Colleague 接口 ConcreteColleague
ColleagueTextField 表示文本輸入框的類。它實(shí)現(xiàn)了 Colleague 接口 ConcreteColleague
ColleagueCheckbox 表示單選框的類。它實(shí)現(xiàn)了 Colleague 接口 ConcreteColleague
LoginFrame 表示登錄對(duì)話框的類。它實(shí)現(xiàn)了 Mediator 接口 ConcreteMediator
Main 測(cè)試程序行為的類

Mediator.java

package mediator;

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

Colleague.java

package mediator;

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

ColleagueButton.java

package mediator;

import java.awt.*;

public class ColleagueButton extends Button implements Colleague {
    private Mediator mediator;
    public ColleagueButton(String caption) {
        super(caption);
    }
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
    }
}

ColleagueTextField.java

package mediator;

import java.awt.*;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;

public class ColleagueTextField extends TextField implements TextListener, Colleague {
    private Mediator mediator;
    public ColleagueTextField(String text, int columns) {
        super(text, columns);
    }
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
        setBackground(enabled ? Color.WHITE : Color.lightGray);
    }
    public void textValueChanged(TextEvent e) {
        mediator.colleagueChanged();
    }
}

ColleagueCheckbox.java

package mediator;

import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
    private Mediator mediator;
    public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
        super(caption, group, state);
    }
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
    public void setColleagueEnabled(boolean enabled) {
        setEnabled(enabled);
        setBackground(enabled ? Color.WHITE : Color.lightGray);
    }
    public void itemStateChanged(ItemEvent e) {
        mediator.colleagueChanged();
    }
}

LoginFrame.java

package mediator;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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;

    // 構(gòu)造函數(shù)
    // 生成并配置各個(gè)Colleague后,顯示對(duì)話框
    public LoginFrame(String title) {
        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();
    }

    public void createColleague() {
        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");
        checkGuest.setMediator(this);
        checkLogin.setMediator(this);
        textUser.setMediator(this);
        textPass.setMediator(this);
        buttonOk.setMediator(this);
        buttonCancel.setMediator(this);
        checkGuest.addItemListener(checkGuest);
        checkLogin.addItemListener(checkLogin);
        textUser.addTextListener(textUser);
        textPass.addTextListener(textPass);
        buttonOk.addActionListener(this);
        buttonCancel.addActionListener(this);
    }

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

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

Main.java

package mediator;

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

Mediator 模式中的角色

  1. Mediator(仲裁者、中介者)

    Mediator 角色負(fù)責(zé)定義與 Colleague 角色進(jìn)行通信和做出決定的接口。

  2. ConcreteMediator(具體的仲裁者、中介者)

    ConcreteMediator 角色負(fù)責(zé)實(shí)現(xiàn) Mediator 角色的接口,負(fù)責(zé)實(shí)際做出決定。

  3. Colleague(同事)

    Colleague 角色負(fù)責(zé)定義與 Mediator 角色進(jìn)行通信的接口。

  4. ConcreteColleague(具體的同事)

    ConcreteColleague 角色負(fù)責(zé)實(shí)現(xiàn) Colleague 角色的接口。

拓展思路

一、Bug容易定位,因?yàn)闆]有別的控制控件做邏輯控制處理。

二、ConcreteColleague 角色可以復(fù)用,ConcreteMediator 角色難以復(fù)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容