只有一個(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 模式中的角色
-
Mediator(仲裁者、中介者)
Mediator 角色負(fù)責(zé)定義與 Colleague 角色進(jìn)行通信和做出決定的接口。
-
ConcreteMediator(具體的仲裁者、中介者)
ConcreteMediator 角色負(fù)責(zé)實(shí)現(xiàn) Mediator 角色的接口,負(fù)責(zé)實(shí)際做出決定。
-
Colleague(同事)
Colleague 角色負(fù)責(zé)定義與 Mediator 角色進(jìn)行通信的接口。
-
ConcreteColleague(具體的同事)
ConcreteColleague 角色負(fù)責(zé)實(shí)現(xiàn) Colleague 角色的接口。
拓展思路
一、Bug容易定位,因?yàn)闆]有別的控制控件做邏輯控制處理。
二、ConcreteColleague 角色可以復(fù)用,ConcreteMediator 角色難以復(fù)用。