读书笔记 仅供参考
简述
Mediator 就是 仲裁者(中介者)模式。如果将程序看作许多类作为一个团队进行工作,那么团队的交流过程就是组员向仲裁者报告,仲裁者向组员下达指标,组员之间不再相互询问。
角色和 UML
Mediator
角色负责定义与 Colleague 角色进行通信和做出决定的接口(API)。
ConcreteMediator
负责实现 Mediator 角色的接口(API)。
Colleague(同事)
负责定义与 Mediator 角色进行通信的接口。
ConcreteColleague
负责实现 Colleague 角色的接口(API)。
UML
例子
例程是一个登录框的控制,有比较多的状态改变
大致如下图:
使用方法如下:
- 可以选择作为游客或用户访问
- 作为用户登录时,需要输入正常的用户名和密码
- 点击 OK 按钮登录,点击 Cancel 按钮取消登录
状态变化如下:
- 作为游客时,禁止用户名输入框和密码输入框
- 作为用户时,启用用户名输入框和密码输入框
- 如果用户输入框中没有字符,禁用密码输入框
- 用户名输入框中有字符,启用密码输入框
- 当用户名输入框和密码输入框中都有字符时,OK 按钮可以使用,否则不能使用
- Cancel 按钮一直可以使用
代码
public interface Mediator {
// 生成组员API
void createColleague();
//被各个 Colleague 使用,向仲裁者报告
void colleagueChanged();
}
public interface Colleague {
//让组员知道仲裁者
void SetMediator(Mediator mediator);
//告知组员仲裁者下达的命令,在这个例子中就是启用或不启用
void setColleagueEnabled(boolean enabled);
}
/登录框的按钮
public class ColleagueButton extends Button implements Colleague {
private Mediator mediator;
public ColleagueButton(String label) throws HeadlessException {
super(label);
}
@Override
public void SetMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
// 登录窗口的文本框
public class ColleagueTextField extends TextField implements TextListener, Colleague {
private Mediator mediator;
public ColleagueTextField(String text, int columns) throws HeadlessException {
super(text, columns);
}
@Override
public void SetMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
setBackground(enabled ? Color.WHITE : Color.lightGray);
}
// 当文字发生变化是通知 Meditor
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
}
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
private Mediator mediator;
public ColleagueCheckbox(String label, CheckboxGroup group, boolean state) throws HeadlessException {
super(label, group, state);
}
@Override
public void SetMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
// 状态改变时调用
@Override
public void itemStateChanged(ItemEvent e) {
mediator.colleagueChanged();
}
}
// 作为仲裁者
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;
public LoginFrame(String title) throws HeadlessException {
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();
}
@Override
public void createColleague() {
CheckboxGroup group = new CheckboxGroup();
checkGuest = new ColleagueCheckbox("Guest", group, true);
checkLogin = new ColleagueCheckbox("Login", group, 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);
buttonCancel.SetMediator(this);
buttonOk.SetMediator(this);
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
@Override
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);
}
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.toString());
System.exit(0);
}
}
public class Main {
public static void main(String[] args) {
new LoginFrame("Mediator Sample");
}
}