对于一个模块,可能由多个对象构成,而且这些对象之间可能存在相互的引用,如下图所示:
为了减少对象之间复杂的引用关系,降低系统的耦合度,因此引出了中介者模式,也是中介者模式创建的动机。
GoF给出的定义:
中介者模式就是用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散,从而可以独立地改变他们之间的交互。
中介者模式是一种对对象之间的关系进行封装,是一种对象行为型模式,这样设计可以使各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。
优点:减少系统对象之间的关系,提高对象的可复用性和扩展性
缺点:中介者对象会变得庞大和复杂
中介者UML类图如下所示:
1、Mediator(抽象中介者)
定义一个接口用于和各同事之间进行通信
2、ConcreteMediator(具体中介者)
协调各同事对象实现协作行为,了解维护各个同事对象之间的关系
3、Colleague(抽象同事类)
定义同事类接口,定义各同事的共有方法
4、具体同事类(ConcreteColleague)
实现抽象同事类中的方法。每个同事类都需要知道中介者对象,每个具体同事类只需要了解自己的行为,不用关系其他同事类如何实现,在需要与其他同事类进行通信时需要先于中介者对象进行通信,实现间接的调用。
中介者模式的核心在于中介者类的引入,在该模式中,中介者模式承担了两方面的职责:
1、中转作用
类似于打电话时的基站的作用,所有同事对象要想与其他对象进行通信,必须与中介者对象进行通讯,由中介者对象来管理两者之间的通信。
2、协调作用
协调各个对象之间的关系
中介者模式应用最广泛的一个场景就是消息中间件
来进行测试:
测试例子房东,中介和 应届毕业大学生
分析:
1、房东和应届毕业大学生都是属于Person,因此抽象出来建立一个抽象类
2、中介可能有多家,因此建立一个抽象的中介
3、建立房东类和应届毕业大学生两个实体类
4、建立具体的中介类
public abstract class Person {
Mediator m_mediator;
abstract void SetMediator(Mediator mediator);
abstract void SendMessage(String message);
abstract void getMessage(String message);
}
public interface Mediator {
void Send(String message, Person person);
void SetA(Person person);
void SetB(Person person);
}
public class Rentor extends Person {
@Override
public void SetMediator(Mediator mediator) {
super.m_mediator = mediator;
}
@Override
public void SendMessage(String message) {
super.m_mediator.Send(message,this);
}
@Override
public void getMessage(String message) {
System.out.println("租户收到消息: " + message);
}
}
public class Landlord extends Person {
@Override
void SetMediator(Mediator mediator) {
super.m_mediator = mediator;
}
@Override
void SendMessage(String message) {
super.m_mediator.Send(message,this);
}
@Override
void getMessage(String message) {
System.out.println("房东收到消息: " + message);
}
}
public class HouseMediator implements Mediator{
private Person personA,personB;
@Override
public void Send(String message, Person person) {
if (person.equals(personA)){
personB.getMessage(message);
}else if(person.equals(personB)){
personA.getMessage(message);
}
}
@Override
public void SetA(Person person) {
personA = person;
}
@Override
public void SetB(Person Person) {
personB = Person;
}
}
测试代码
public class Test {
public static void main(String[] args) {
//建立一个中介者
Mediator mediator = new HouseMediator();
//创建房东和租户
Person rendor = new Rentor();
Person Landlord = new Landlord();
//中介者和租户建立连接
mediator.SetA(rendor);
//中介者和房东建立连接
mediator.SetB(Landlord);
//房东和租户进行联系
//消息
String message = "有空闲房子";
//房东给中介发送消息
mediator.Send(message,Landlord);
//租户给中介发送的消息
String messageRendor = "好的,明天去看房";
//中介将消息发送给房东
mediator.Send(messageRendor, rendor);
}
}
结果:
租户收到消息: 有空闲房子
房东收到消息: 好的,明天去看房