1.定义
Mediator,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
- 将一个系统分割成许多对象通常可以增加复用性,但是对象间相互连接的激增又会降低其可复用性。
- 因为大量的连接使得一个对象不可能再没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以对系统的行为进行任何较大的改动就十分困难。
2.基本代码
(1)抽象中介者类
package designmode.mediator;
public abstract class Mediator {
//抽象,得到同事对象以及发送信息
public abstract void Send(String message,Colleague colleague);
}
(2)抽象同事类
package designmode.mediator;
public class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator=mediator;
}
}
(3)具体中介者类
package designmode.mediator;
public class ConcreteMediator extends Mediator{
private ConcreteColleague1 concreteColleague1;
public ConcreteColleague2 concreteColleague2;
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
//根据对象做出选择判断,通知对象 这里是重点
@Override
public void Send(String message, Colleague colleague) {
if(colleague==concreteColleague1){
concreteColleague2.Notify(message);
}else{
concreteColleague1.Notify(message);
}
}
}
(4)具体同事类
package designmode.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);
}
}
package designmode.mediator;
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);
}
}
(5)客户端
package designmode.mediator;
public class Client {
public static void main(String[] args) {
ConcreteMediator concreteMediator=new ConcreteMediator();
ConcreteColleague1 c1=new ConcreteColleague1(concreteMediator);
ConcreteColleague2 c2=new ConcreteColleague2(concreteMediator);
concreteMediator.setConcreteColleague1(c1);
concreteMediator.setConcreteColleague2(c2);
c1.Send("吃饭了没?");
c2.Send("没有呢,一起去?");
}
}
测试结果
同事2得信息:吃饭了没?
同事1得信息:没有呢,一起去?
Process finished with exit code 0
3.优缺点,应用场合
-
中介者需要直到所有的具体同事类,责任太大
-
中介者模式很容易在系统中应用,也容易误用,当系统出现‘多对多’交互复杂的对象群时,不要急于使用,而是首先反思系统在系统上的设计是否合理。
优点
- Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.
- 由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象从对象各自本身的行为转移到他们之间的交互上来,也就是站在了一个更宏观的角度去看待系统。
缺点
- 由于ConcreteMediator控制了集中化,于是把交互复杂性变为了中介者的复杂性,这就是使得中介者会变得比任何一个ConcreteColleague都复杂。
应用场合
一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。
以及向定制一个分布在多个类中的行为,但又不想生成太多子类的场合。