JavaMediator模式
本文最后更新于:1 年前
只有一个仲裁者
1 - 定义”仲裁者”的接口(API)的接口
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
}
2 - 定义”组员”的接口(API)的接口
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
3 - 表示按钮的类, 它实现了Colleague接口
public class ColleagueButton extends Button implements Colleague {
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
@Override
public void setMediator(Mediator mediator) { // 保存Mediator
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) { // Mediator 下达启用/禁用的指示
setEnabled(enabled);
}
}
4 - 表示文本输入框的类, 它实现了Colleague接口
public class ColleagueTextField extends TextField implements TextListener, Colleague {
private Mediator mediator;
public ColleagueTextField(String text, int columns){
super(text, columns);
}
@Override
public void textValueChanged(TextEvent textEvent) { // 当文字发生改变时通知Mediator
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) { // Mediator 下达启用/禁用的指示
setEnabled(enabled);
setBackground(enabled ? Color.white : Color.lightGray);
}
}
5 - 表示勾选框(此处是单按钮)的类, 它实现了Colleague接口
public class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
private Mediator mediator;
public ColleagueCheckbox(String caption, CheckboxGroup group, boolean state) {
super(caption, group, state);
}
@Override
public void itemStateChanged(ItemEvent itemEvent) { // 当状态发生改变时通知Mediator
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void setColleagueEnabled(boolean enabled) { // Mediator 下达启用/禁用的指示
setEnabled(enabled);
}
}
6 - 表示登录对话框的类, 它实现了Mediator接口
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;
// 构造函数
// 生成并配置各个Colleague后,显示对话框
public LoginFrame(String title) {
super(title);
setBackground(Color.LIGHT_GRAY);
// 使用布局管理器生成4x2的窗格
setLayout(new GridLayout(4, 2));
// 生成各个Colleague
createColleagues();
// 配置
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 actionPerformed(ActionEvent actionEvent) {
System.out.println(actionEvent.toString());
System.exit(0);
}
// 生成各个Colleague
@Override
public void createColleagues() {
// 生成
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");
// 设置Mediator
checkGuest.setMediator(this);
checkLogin.setMediator(this);
textUser.setMediator(this);
textPass.setMediator(this);
buttonOk.setMediator(this);
buttonCancel.setMediator(this);
// 设置Listener
checkGuest.addItemListener(checkGuest);
checkLogin.addItemListener(checkLogin);
textUser.addTextListener(textUser);
textPass.addTextListener(textPass);
buttonOk.addActionListener(this);
buttonCancel.addActionListener(this);
}
// 接收来自于Colleague的通知然后判断个Colleague的启用/禁用状态
@Override
public void colleagueChanged() {
if(checkGuest.getState()) {
textUser.setColleagueEnabled(false);
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(true);
}else {
textUser.setColleagueEnabled(true);
underpassChanged();
}
}
// 当textUser或textPass文本输入框中的文字发生变化时
// 判断Colleague的启用/禁用状态
public void underpassChanged() {
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);
}
}
}
7 - 表示测试程序行为的类
public class Main {
public static void main(String[] args) {
new LoginFrame("Mediator Sample");
}
}
8 - 输出示例
// 具体见窗口
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=OK,
when=1601126737494,modifiers=] on button0
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!