1. Mediator模式
星型结构,有一个仲裁者,组员向仲裁者报告,由仲裁者向组员下达指示
1.1 Mediator模式的类图
登场角色:
-
Mediator(仲裁者、中介者)
定义了与Colleague角色进行通信和做出决定的接口 -
ConcreteMediator(具体的仲裁者、中介者)
实现了仲裁者接口 -
Colleague(同事、组员)
定义了与Mediator角色进行通信的接口 -
ConcreteColleague(具体的同事、组员)
实现了组员接口
1.2 示例程序
类一览表
名字 | 说明 |
---|---|
Mediator | 仲裁者接口 |
Colleague | 组员接口 |
ColleagueButton | 表示按钮的类 |
ColleagueTextField | 表示文本输入框类 |
ColleagueCheckBox | 表示勾选框类 |
LoginFrame | 实现了仲裁者接口,显示登陆对话框 |
Main | 测试类 |
uml类图(只含实现关系)
uml类图
Mediator接口
package xin.ajay.mediator;
public interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged();
}
Colleague接口
package xin.ajay.mediator;
public interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
ColleagueButton类
package xin.ajay.mediator.impl;
import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.Mediator;
import javax.swing.*;
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;
}
//mediator下达启用/静止指示
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(true);
}
}
ColleagueCheckBox类
package xin.ajay.mediator.impl;
import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.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 label, CheckboxGroup group, boolean state) throws HeadlessException {
super(label, group, state);
}
//告诉mediator自己发生了改变
@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);
}
}
ColleagueTextField类
package xin.ajay.mediator.impl;
import xin.ajay.mediator.Colleague;
import xin.ajay.mediator.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);
}
@Override
public void textValueChanged(TextEvent e) {
mediator.colleagueChanged();
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
//受mediator指示
@Override
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
setBackground(enabled?Color.white:Color.lightGray);
}
}
LoginFrame类
package xin.ajay.mediator.ui;
import xin.ajay.mediator.Mediator;
import xin.ajay.mediator.impl.ColleagueButton;
import xin.ajay.mediator.impl.ColleagueCheckbox;
import xin.ajay.mediator.impl.ColleagueTextField;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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){
super(title);
setBackground(Color.lightGray);
setLayout(new GridLayout(4,2));
//创建同事
createColleagues();
add(checkGuest);
add(checkLogin);
add(new Label("Username:"));
add(textUser);
add(new Label("Password:"));
add(textPass);
add(buttonOK);
add(buttonCancel);
//设置初始状态
colleagueChanged();
pack();
setVisible(true);
}
@Override
public void createColleagues() {
CheckboxGroup checkboxGroup = new CheckboxGroup();
checkGuest = new ColleagueCheckbox("Guest", checkboxGroup, true);
checkLogin = new ColleagueCheckbox("Login", checkboxGroup, false);
this.textPass = new ColleagueTextField("", 10);
this.textUser = 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);
//设置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.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 (textUser.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);
}
}
Main类
package xin.ajay.mediator.ui;
public class Main {
public static void main(String[] args) {
new LoginFrame("Mediator Sample");
}
}
###结果
鸣谢:
GoF《设计模式》和结城浩的《图解设计模式》