定义:用一个中介对象来封装(封装变化)一系列的对象交互中介者使各对象不需要显式的相互引用(编译时依赖→运行时依赖),从而使其耦合松散(管理变化),而A可以独立地改变它们之间的交互。,而是通过中介者对象来与另一个对象发生相互作用。
通过中介者模式,可以将复杂关系的网状结构变成结构简单的以中介者为核心的星形结构,每个对象不再和他与之关联的对象直接发生相互作用,而是通过中介者对象来与另一个对象发生相互作用。
//抽象同事类
abstract class Colleague{
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
}
//抽象中介者类
abstract class Mediator{
//定义一个抽象的发送消息的方法,得到同事对象和发送的消息
public abstract void Send(String message,Colleague colleague);
}
//具体同事类1
class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
public void Send(String message) {
mediator.Send(message, this);//concretecolleague1发送message
}
public void Notify(String message) {
System.out.println("同事1得到消息:"+message);
}
}
class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
public void Send(String message) {
mediator.Send(message, this);
}
public void Notify(String message) {
System.out.println("同事2得到消息:"+message);//concretecolleague2发送message
}
}
//具体中介者类
class ConcreteMediator extends Mediator{
//需要了解所有的具体同事对象
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
public ConcreteColleague1 getColleague1() {
return colleague1;
}
public ConcreteColleague2 getColleague2() {
return colleague2;
}
public void setColleague2(ConcreteColleague2 colleague2) {
this.colleague2 = colleague2;
}
public void setColleague1(ConcreteColleague1 colleague1) {
this.colleague1 = colleague1;
}
@Override
public void Send(String message, Colleague colleague) {
// TODO Auto-generated method stub
if(colleague==colleague1) {
colleague2.Notify(message);
}else {
colleague1.Notify(message);
}
}
}
public class Main{
public static void main(String[] args){
ConcreteMediator m=new ConcreteMediator();
//让两个具体同事类认识中介者对象
ConcreteColleague1 c1=new ConcreteColleague1(m);
ConcreteColleague2 c2=new ConcreteColleague2(m);
//让中介者认识各个具体同事类
m.setColleague1(c1);
m.setColleague2(c2);
//具体同事类对象发送消息都是通过中介者转发
c1.Send("吃饭了吗?");
c2.Send("没有呢,一起?");
}
}
结果为:
同事2得到消息:吃饭了吗?
同事1得到消息:没有呢,一起?
中介者对象的作用:
1.结构中起到中转作用
2.行为上起到协作作用,将同事成员之间的关系行为进行分离和封装。
例题:为了国家之间的相互联系,联合国安理会做中介。
//国家
abstract class Country{
protected UnitedNations mediator;
public Country(UnitedNations mediator) {
this.mediator=mediator;
}
}
//联合国机构
abstract class UnitedNations{
//声明
public abstract void Send(String message,Country colleague);
}
//美国
class USA extends Country{
public USA(UnitedNations mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
//声明
public void Declare(String message) {
mediator.Send(message, this);
}
//获取消息
public void GetMessage(String message) {
System.out.println("美国获得对方消息:"+message);
}
}
//伊拉克
class Iraq extends Country{
public Iraq(UnitedNations mediator) {
super(mediator);
// TODO Auto-generated constructor stub
}
//声明
public void Declare(String message) {
mediator.Send(message, this);
}
//获取消息
public void GetMessage(String message) {
System.out.println("伊拉克获得对方消息:"+message);
}
}
//联合国安全理事会
class UnitedNationsSecurity extends UnitedNations{
//需要了解所有的具体同事对象
private USA colleague1;
private Iraq colleague2;
public USA getColleague1() {
return colleague1;
}
public Iraq getColleague2() {
return colleague2;
}
public void setColleague2(Iraq colleague2) {
this.colleague2 = colleague2;
}
public void setColleague1(USA colleague1) {
this.colleague1 = colleague1;
}
@Override
public void Send(String message, Country colleague) {
// TODO Auto-generated method stub
if(colleague==colleague1) {
colleague2.GetMessage(message);
}else {
colleague1.GetMessage(message);
}
}
}
public class Main{
public static void main(String[] args){
UnitedNationsSecurity UNSC=new UnitedNationsSecurity();
USA c1=new USA(UNSC);
Iraq c2=new Iraq(UNSC);
UNSC.setColleague1(c1);
UNSC.setColleague2(c2);
c1.Declare("不准研发核武器");
c2.Declare("没研发");
}
}
结果:
伊拉克获得对方消息:不准研发核武器
美国获得对方消息:没研发
优点:
1.Mediator模式是一科很有用并且很常用的模式,它将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
2.Mediator还获得系统解耦的特性,通过Mediator,各个Colleague就不必维护各自通信的对象和通信协议,降低了系统的耦合性, Mediator和各个Colleague就可以相互独立地修改了。
3.Mediator模式还有一个很显著的特点就是将控制集中,集中的优点就是便于管理,也正符合了OO设计中的每个类的职责要单一和集中的原则。
缺点:
控制的集中化把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
什么时候使用中介者模式呢?
1、如果一组对象之间的通信方式比较复杂,导致相互依赖、结构混乱,可以采用中介者模式,把这些对象相互的交互管理起来。2、如果一个对象引用很多的对象,并直接跟这些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里面。
门面模式与中介者模式有相似之处,都是为了处理复杂的关系,他们有什么区别呢?
门面模式关注的是这组复杂对象如何与外界通信。
中介者模式是调配这组复杂对象之间的通信。