Java中的中介者模式(Mediator Pattern)是一种行为设计模式,它的主要目标是降低多个对象之间的交互复杂度,通过引入一个中介者对象来管理这些对象之间的通信,从而减少对象间的直接依赖。
原理
中介者模式的关键在于将对象之间的交互封装在一个中介者对象内,这样可以将原本错综复杂的多对多交互转化为简单的中介者与各个对象之间的一对多交互。这样做的好处是减少了对象之间的耦合,提高了系统的可维护性和灵活性。
实现方式
中介者模式的实现通常包括以下几个角色:
- Mediator(中介者接口):定义同事对象之间通信的协议。
- Concrete Mediator(具体中介者):实现中介者接口,负责协调同事对象,通常是通过接收来自同事对象的消息并决定如何分发这些消息。
- Colleague(同事接口):定义同事类的行为和操作,同事对象并不直接通信,而是通过中介者对象进行通信。
- Concrete Colleague(具体同事):实现同事接口,每个具体同事都持有中介者的一个引用,并通过这个引用向中介者发送消息。
首先,我们定义Mediator
接口:
public interface Mediator {
void sendMessage(String msg, User user);
}
然后,我们实现具体的中介者ChatRoom
:
public class ChatRoom implements Mediator {
@Override
public void sendMessage(String msg, User user) {
System.out.println(user.getName() + " says: " + msg);
}
}
接着,我们定义User
(同事)接口:
public interface User {
void sendMessage(String msg);
void receiveMessage(String msg);
}
再实现具体的User
类:
public class ConcreteUser implements User {
private String name;
private Mediator mediator;
public ConcreteUser(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
@Override
public void sendMessage(String msg) {
System.out.println(name + " sends message: " + msg);
mediator.sendMessage(msg, this);
}
@Override
public void receiveMessage(String msg) {
System.out.println(name + " receives message: " + msg);
}
public String getName() {
return name;
}
}
最后,我们可以在主函数中使用这些类:
public class Main {
public static void main(String[] args) {
Mediator chatRoom = new ChatRoom();
User john = new ConcreteUser(chatRoom, "John");
User jane = new ConcreteUser(chatRoom, "Jane");
john.sendMessage("Hello there!");
jane.sendMessage("Hi John!");
}
}
在上面的例子中,ChatRoom
作为中介者管理了用户之间的通信。当一个用户发送消息时,它通过中介者发送,而不是直接发送给另一个用户。这样,即使有更多用户加入聊天室,我们也不需要在用户类中做任何改变,只需将它们添加到中介者中即可。
这只是一个基本的示例,实际应用中中介者可能需要处理更复杂的逻辑,例如过滤消息、记录通信历史等。
优缺点
优点
- 减少对象间的依赖:同事对象不需要直接引用彼此,降低了对象间的耦合度。
- 易于维护和扩展:当需要添加新的同事或修改同事的行为时,通常只需要修改中介者类,而不必改动其他同事类。
- 封装变化:中介者模式能够封装系统中可能变化的部分,使得系统更易于理解和维护。
- 遵循单一职责原则:同事对象专注于自身业务逻辑,而通信逻辑则由中介者管理。
缺点
- 中介者可能变得庞大复杂:如果系统中同事对象的数量很多,中介者类可能会变得非常大和复杂,因为它需要管理所有同事对象的交互。
- 可能引入新的依赖:虽然减少了同事对象间的直接依赖,但同事对象对中介者的依赖可能会成为新的单点故障。
- 可能增加理解难度:对于新加入项目的人来说,理解中介者模式以及整个系统架构可能会更加困难。
使用场景
中介者模式适用于以下情况:
- 当一个系统中有多个对象之间存在复杂的交互关系,导致系统结构混乱时。
- 当希望减少对象间的直接通信,使得对象之间松耦合时。
- 当需要简化和标准化对象间的通信机制时。
总的来说,中介者模式是一种强大的工具,可以简化系统的设计和实现,但在使用时也应考虑到其可能带来的复杂性和维护性问题。