1.中介者设计模式,这个主要的使用场景是,当多个对象之间有数据交互时,它们之间不直接通信,而是把要发送的数据交给中介者,中介者完成相应处理,按一定的条件发给目标对象。
2.首先一个示例,USA,Iraq,这两个类继承Country这个类,UnitedNationSecurityCouncil继承UnitedNations是中介者角色,它负责传达信息。
package com.war;
abstract class UnitedNations {
public abstract void Declare(String message, Country colleague);
}
abstract class Country {
protected UnitedNations un;
public Country(UnitedNations un) {
this.un = un;
}
}
class USA extends Country {
public USA(UnitedNations mediator) {
super(mediator);
}
public void Declare(String message) {
un.Declare(message, this);
}
public void GetMessage(String message) {
System.out.println("美方获得的信息是: " + message);
}
}
class Iraq extends Country {
public Iraq(UnitedNations mediator) {
super(mediator);
}
public void Declare(String message) {
un.Declare(message, this);
}
public void GetMessage(String message) {
System.out.println("伊拉克获得的信息是: " + message);
}
}
class UnitedNationSecurityCouncil extends UnitedNations {
private USA usa;
private Iraq iraq;
public void setUSA(USA usa) {
this.usa = usa;
}
public void setIraq(Iraq iraq) {
this.iraq = iraq;
}
@Override
public void Declare(String message, Country colleague) {
if (colleague == usa) {
iraq.GetMessage(message);
}
else {
usa.GetMessage(message);
}
}
}
public class Main {
public static void main(String[] args) {
UnitedNationSecurityCouncil unsc = new UnitedNationSecurityCouncil();
USA usa = new USA(unsc);
Iraq iraq = new Iraq(unsc);
unsc.setIraq(iraq);
unsc.setUSA(usa);
usa.Declare("你妈的!");
iraq.Declare("想要我们的石油!");
}
}
3.这是一个比较复杂的示例,一个登陆窗口的设计,窗口上有TextFile,Button,Checkbox等组件,它们是否可用是有一定的关系的,而LoginFrame继承Mediator来处理这样的关系,它充当了中介者的角色。
package com.cn;
import java.awt.Button;
import java.awt.Checkbox;
import java.awt.CheckboxGroup;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
interface Mediator {
public abstract void createColleagues();
public abstract void colleagueChanged(Colleague colleague);
}
interface Colleague {
public abstract void setMediator(Mediator mediator);
public abstract void setColleagueEnabled(boolean enabled);
}
class ColleagueButton extends Button implements Colleague {
private static final long serialVersionUID = 1L;
private Mediator mediator;
public ColleagueButton(String caption) {
super(caption);
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void setColleagueEnabled(boolean enabled) {
setEnabled(enabled);
}
}
class ColleagueTextField extends TextField implements TextListener, Colleague {
private static final long serialVersionUID = 1L;
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(this);
}
}
class ColleagueCheckbox extends Checkbox implements ItemListener, Colleague {
private static final long serialVersionUID = 1L;
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);
}
public void itemStateChanged(ItemEvent e) {
System.out.println("2");
mediator.colleagueChanged(this);
}
}
class LoginFrame extends Frame implements ActionListener, Mediator {
private static final long serialVersionUID = 1L;
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(checkGuest);
pack();
setVisible(true);
}
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");
checkGuest.setMediator(this);
System.out.println("1");
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(Colleague c) {
if (c == checkGuest || c == checkLogin) {
if (checkGuest.getState()) {
textUser.setColleagueEnabled(false);
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(true);
}
else {
textUser.setColleagueEnabled(true);
userpassChanged();
}
}
else if (c == textUser || c == textPass) {
userpassChanged();
} else {
System.out.println("colleagueChanged:unknown colleague = " + c);
}
}
private void userpassChanged() {
if (textUser.getText().length() > 0) {
textPass.setColleagueEnabled(true);
if (textPass.getText().length() > 0) {
buttonOk.setColleagueEnabled(true);
System.out.println("ss");
} else {
System.out.println("ss3");
buttonOk.setColleagueEnabled(false);
}
} else {
textPass.setColleagueEnabled(false);
buttonOk.setColleagueEnabled(false);
}
}
public void actionPerformed(ActionEvent e) {
System.out.println("" + e);
System.exit(0);
}
}
public class Main {
public static void main(String[] args) {
new LoginFrame("Mediator Sample");
}
}