目录
一、什么是中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它定义了一个中介对象来封装一系列对象之间的交互,使这些对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互 。在中介者模式中,对象之间的通信不再直接进行,而是通过一个中介者对象来进行。这样做的好处是可以降低对象之间的耦合度,提高系统的可维护性和可扩展性。
为了更好地理解中介者模式,我们可以通过一个生活中的例子来解释。假设你想要购买一套房子,你可以通过房产中介来寻找合适的房源。房产中介就相当于中介者对象,而你和房东则相当于同事对象。你不需要直接与房东联系,只需要通过房产中介来进行沟通和协调。这样做的好处是可以减少你和房东之间的直接交互,降低耦合度,同时也可以提高效率。
在代码实现中,中介者模式通常包含以下几个角色:
- 抽象中介者(Mediator):定义了同事对象之间通信的接口,一般以抽象类或接口的形式存在。
- 具体中介者(Concrete Mediator):实现了抽象中介者接口,负责协调同事对象之间的交互,维护对各个同事对象的引用 。
- 抽象同事类(Colleague):定义了同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
下面是一个简单的 Java 代码示例,演示了中介者模式的基本实现:
// 抽象中介者
abstract class Mediator {
public abstract void send(String message, Colleague colleague);
}
// 具体中介者
class ConcreteMediator extends Mediator {
private Colleague colleague1;
private Colleague colleague2;
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
@Override
public void send(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague2.receive(message);
} else {
colleague1.receive(message);
}
}
}
// 抽象同事类
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive(String message);
public abstract void send(String message);
}
// 具体同事类1
class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String message) {
System.out.println("同事1收到消息: " + message);
}
@Override
public void send(String message) {
mediator.send(message, this);
}
}
// 具体同事类2
class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String message) {
System.out.println("同事2收到消息: " + message);
}
@Override
public void send(String message) {
mediator.send(message, this);
}
}
在上述代码中,Mediator是抽象中介者,定义了send方法用于同事之间的通信;ConcreteMediator是具体中介者,实现了send方法,并维护了两个同事对象的引用;Colleague是抽象同事类,持有中介者对象的引用,并定义了receive和send方法;ConcreteColleague1和ConcreteColleague2是具体同事类,实现了抽象同事类中的方法,通过中介者来发送和接收消息。
通过中介者模式,我们可以将对象之间的复杂交互关系封装在中介者对象中,使得对象之间的耦合度降低,提高了系统的可维护性和可扩展性。在实际应用中,中介者模式常用于处理多个对象之间的交互场景,如聊天系统、图形用户界面等。
二、中介者模式的工作原理
为了更直观地理解中介者模式的工作原理,我们以一个简单的聊天系统为例进行说明 。在这个聊天系统中,有多个用户(具体同事类),他们之间可以互相发送消息。为了实现用户之间的解耦,我们引入了一个聊天服务器(具体中介者)来负责消息的转发。
假设用户 A、用户 B 和用户 C 在同一个聊天房间中。当用户 A 发送一条消息时,他并不会直接将消息发送给用户 B 和用户 C,而是将消息发送给聊天服务器。聊天服务器接收到消息后,会根据消息的内容和目标用户,将消息转发给用户 B 和用户 C。同样地,当用户 B 或用户 C 发送消息时,也是通过聊天服务器来进行转发的。
具体的工作流程如下:
-
用户 A 创建一个消息对象,并调用自己的send方法,将消息发送出去。
-
在send方法中,用户 A 将消息传递给聊天服务器(中介者)的sendMessage方法,并传入自己的引用,以便服务器知道消息的发送者。
-
聊天服务器接收到消息后&#x