中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。【互相组合】
/**
* 抽象中介者类
*
* @author liu yuning
*/
public abstract class Mediator {
public abstract void send(String message, Colleague colleague);
}
class ConcreteMediator extends Mediator {
// 需要了解所有的具体同事对象
private ConcreteColleague1 c1;
private ConcreteColleague2 c2;
public ConcreteColleague1 getC1() {
return c1;
}
public void setC1(ConcreteColleague1 c1) {
this.c1 = c1;
}
public ConcreteColleague2 getC2() {
return c2;
}
public void setC2(ConcreteColleague2 c2) {
this.c2 = c2;
}
@Override
public void send(String message, Colleague colleague) {
// 重写发送信息的方法,根据对象做出选择判断,通知对象
if (colleague == c1) {
c2.notifyMsg(message);
} else {
c1.notifyMsg(message);
}
}
}
/**
* 抽象同事类
*
* @author liu yuning
*
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void sendMsg(String message);
public abstract void notifyMsg(String message);
}
class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String message) {
mediator.send(message, this);
}
@Override
public void notifyMsg(String message) {
System.out.println("同事1得到消息:" + message);
}
}
class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void sendMsg(String message) {
mediator.send(message, this);
}
@Override
public void notifyMsg(String message) {
System.out.println("同事2得到消息:" + message);
}
}
/**
* 客户端
*
* @author liu yuning
*
*/
public class MediatorClient {
public static void main(String[] args) {
ConcreteMediator concreteMediator = new ConcreteMediator();
// 让两个具体同事类认识中介者对象
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(
concreteMediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(
concreteMediator);
// 让中介者认识各个具体同事类对象
concreteMediator.setC1(concreteColleague1);
concreteMediator.setC2(concreteColleague2);
// 具体同事类对象的消息发送都是通过中介者对象转发
concreteColleague1.sendMsg("吃过饭了没有?");
concreteColleague2.sendMsg("没有呢,你打算请客?");
}
}
案例 联合国
/**
* 中介者模式(Mediator)
* 国家
*/
public abstract class Country {
protected UnitedNations mediator;
public Country(UnitedNations mediator) {
this.mediator = mediator;
}
}
/**
* 中介者模式(Mediator)
* 伊拉克
*/
public class Iraq extends Country {
public Iraq(UnitedNations mediator) {
super(mediator);
}
// 声明
public void declare(String message) {
mediator.declare(message, this);
}
// 获得消息
public void getMessage(String message) {
System.out.println("伊拉克获得对方信息:" + message);
}
}
/**
* 中介者模式(Mediator)
* 美国
*/
public class USA extends Country {
public USA(UnitedNations mediator) {
super(mediator);
}
// 声明
public void declare(String message) {
mediator.declare(message, this);
}
// 获得消息
public void getMessage(String message) {
System.out.println("美国获得对方信息:" + message);
}
}
/**
* 中介者模式(Mediator)
* 联合国机构
*/
public abstract class UnitedNations {
// 声明
public abstract void declare(String message, Country colleague);
}
/**
* 中介者模式(Mediator)
* 联合国安理会
*/
public class UnitedNationsSecurityCouncil extends UnitedNations {
private USA colleague1;
private Iraq colleague2;
public void setColleague1(USA colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Iraq colleague2) {
this.colleague2 = colleague2;
}
@Override
public void declare(String message, Country colleague) {
if (colleague == colleague1) {
colleague2.getMessage(message);
} else {
colleague1.getMessage(message);
}
}
}
/**
* 中介者模式(Mediator)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();
USA c1 = new USA(UNSC);
Iraq c2 = new Iraq(UNSC);
UNSC.setColleague1(c1);
UNSC.setColleague2(c2);
c1.declare("不准研制核武器,否则要发动战争!");
c2.declare("我们没有核武器,也不怕侵略!");
}
}