咱中国自加入WTO以来,通过WTO与世界各国进行贸易,促进了经济发展。而这与本文中要提到的中介者模式十分相关。
一.概述:
中介者模式通过定义了一个中介对象来封装了一系列对象之间的交互,降低了对象之间通信交互的复杂性与耦合度。主要适用于系统中多个类之间相互耦合,形成网状结构时的场景。
MVC架构便是中介者模式典型的案例:控制器作为模型和视图的中介者。
在日常生活中为了方便上下班,我们一般会考虑在所工作的公司附近租房住,而我们租房可以找房东直租,也可以找中介租房。假设有A和B两人需要租房,而找到房东租房,当A有时间看房时,单独找到房东看房,当B有时间看房时,又单独找到房东看房,这样看上去好像没有问题。但是,随着想要租房的人和房东越来越多呢?假设租客有四个,房东有四个,四个租客为了找到自己最喜欢的房想要在自己时间时把四个房东的房都看一遍,那么四个租客都需要单独联系四位房东看房,这其中的通信交互关系是可想而知的复杂。
而这时,如果不找房东直租,直接找中介呢?每个房东只需要把自己的房子交给中介代理,每个租客也只需要联系中介便可以看完所有的房,这就降低了对象之间通信交互的复杂性与耦合度,如下图。
二.结构
中介者模式的结构如下图所示:
如上图,中介者模式的角色大致包含以下的角色:
-
中介者(Mediator):定义了一个接口用于与各个同事对象通信,并管理各个同事对象之间的关系。通常包括一个或多个事件处理方法,用于处理各种交互事件。
-
具体中介者(Concrete Mediator):实现了中介者接口,负责实现各个同事对象之间的通信逻辑。它会维护一个对各个同事对象的引用,并协调它们的交互。
-
同事对象(Colleague):定义了一个接口,用于与中介者进行通信。通常包括一个发送消息的方法,以及一个接收消息的方法。
-
具体同事对象(Concrete Colleague):实现了同事对象接口,是真正参与到交互中的对象。它会将自己的消息发送给中介者,由中介者转发给其他同事对象。
三.实现:
中介类:
public class Mediator {
private List<Landlord> landlords = new ArrayList<>();
// 房东出租
public void register(Landlord landlord) {
landlords.add(landlord);
System.out.println(landlord.getName() + "房子出租");
}
public static void message(Customer customer){
for (Landlord landlord : landlords) {
System.out.println(customer.getName() + "看" + landlord.getName() + "的房");
}
}
}
同事类:
//租客
public class Customer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Customer (String name){
this.name = name;
}
public void look(){
Mediator.message(this, "看房");
}
}
//房东
public class Landlord{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Landlord(String name){
this.name = name;
}
}
客户模拟:
public class MediatorPatternDemo {
public static void main(String[] args) {
Customer customer = new Customer("customer");
Landlord landlord = new Landlord("landlord");
Mediator.register(landlord);
customer.look(landlord);
}
}
结果:
landlord房子出租
customer看landlord的房
四.优缺点分析
优点:
- 实现解耦合:各个对象不再直接相互依赖,而只依赖于中介者,这显著降低了类之间的耦合性。
- 简化交互:中介者模式简化了对象之间的交互过程。在复杂的系统中,对象之间可能存在大量的交互关系,如果直接进行通信,将导致代码复杂且难以维护。通过中介者进行集中管理,可以将复杂的交互逻辑封装在中介者内部,简化了对象之间的通信过程,使得代码更加清晰和易于理解。
- 可扩展性:中介者模式使得系统更加易于扩展。当需要添加新的对象或新的交互关系时,只需要修改中介者的代码,而无需修改其他对象的代码。这降低了系统的扩展难度,提高了系统的可扩展性。
- 统一控制:中介者模式实现了对交互关系的统一控制。通过中介者,可以对对象之间的交互进行全局的管理和协调,确保交互的正确性和一致性。这有助于避免由于对象之间的直接通信而导致的混乱和错误。
缺点:
- 中介者可能变得过于复杂:随着系统中同事类数量的增加,中介者需要管理的交互关系也会变得更为复杂。这可能导致中介者类的逻辑变得庞大且难以维护,增加了系统的复杂性。
- 可能导致系统性能下降:由于所有对象间的交互都需要通过中介者进行,当交互频繁或涉及大量数据时,中介者可能成为性能瓶颈,导致系统响应速度变慢。
- 降低了系统的透明度:由于交互逻辑被封装在中介者内部,外部对象无法直接了解其他对象的交互细节。这降低了系统的透明度,使得理解和调试系统变得更加困难。
- 对中介者的依赖性强:同事类依赖于中介者进行交互,如果中介者出现问题或无法正常工作,整个系统可能会受到影响。这增加了系统的风险,需要确保中介者的稳定性和可靠性。
注意事项:避免在职责不明确或混乱的情况下使用中介者模式,这可能导致中介者承担过多职责。