一、概念
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
二、类图及基本代码
//抽象中介者类
public abstract class Mediator {
//定义一个抽象的发送消息方法,得到同事对象和发送消息
public abstract void Send(String message,Colleague colleague);
}
//具体中介者类
public class ConcreteMediator extends Mediator{
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}
@Override
public void Send(String message, Colleague colleague) {
if(colleague==colleague1){
colleague2.Notify(message);
}else{
colleague1.Notify(message);
}
}
}
//抽象同事类
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator=mediator;
}
}
//具体同事类
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.Send(message, this);
}
public void Notify(String message){
System.out.println("同事1得到的信息:"+message);
}
}
public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.Send(message, this);
}
public void Notify(String message){
System.out.println("同事2得到的信息:"+message);
}
}
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator=new ConcreteMediator();
ConcreteColleague1 colleague1=new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2=new ConcreteColleague2(mediator);
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.send("你吃了吗");
colleague2.send("没呢,正准备吃");
}
}
三、实例之联合国
//联合国
public abstract class UnitedNations {
public abstract void Declare(String message,Country colleague);
}
//联合国安全理事会
public class UnitedNationsSecurityCouncil 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 abstract class Country {
protected UnitedNations unitedNations;
public Country(UnitedNations unitedNations) {
this.unitedNations = unitedNations;
}
}
//美国
public class USA extends Country {
public USA(UnitedNations unitedNations) {
super(unitedNations);
}
public void Declare(String message) {
unitedNations.Declare(message, this);
}
public void GetMessage(String message) {
System.out.println("美国获得对方信息:" + message);
}
}
//伊拉克
public class Iraq extends Country{
public Iraq(UnitedNations unitedNations) {
super(unitedNations);
}
//声明
public void Declare(String message){
unitedNations.Declare(message, this);
}
public void GetMessage(String message){
System.out.println("伊拉克获得对方信息:"+message);
}
}
public class Client {
public static void main(String[] args) {
UnitedNationsSecurityCouncil uCouncil=new UnitedNationsSecurityCouncil();
USA usa=new USA(uCouncil);
Iraq iraq=new Iraq(uCouncil);
uCouncil.setUsa(usa);
uCouncil.setIraq(iraq);
usa.Declare("不准研制核武器");
iraq.Declare("我们没有核武器QAQ");
}
}
四、总结
好处:
中介者模式有利于各同事之间的松耦合,因此可以独立地改变和复用各同事和中介者,便于维护和拓展。
坏处:
因为把控制集中到了中介者,所以中介者变得复杂,这便是控制集中化的弊端。
Laughter is the shortest distance between two people.