Java 中的中介设计模式
中介设计模式是行为设计模式之一,因此它处理对象的行为。中介设计模式用于在系统中的不同对象之间提供集中的通信媒介。
中介设计模式
根据 GoF 的说法,中介模式的意图是:
通过封装不同对象集交互和通信的方式实现松散耦合。允许每个对象集的操作彼此独立地变化。
中介设计模式在多个对象相互交互的企业应用程序中非常有用。如果对象直接相互作用,系统组件彼此紧密耦合,这会增加可维护性成本,并且不难扩展。中介模式专注于在对象之间提供中介以进行通信,并帮助实现对象之间的松耦合。空中交通管制员是中介模式的一个很好的例子,机场控制室充当不同航班之间通信的中介。中介充当对象之间的路由器,它可以有自己的逻辑来提供通信方式。相互通信的系统对象称为同事。通常我们有一个提供通信契约的接口或抽象类,然后我们有中介的具体实现。在我们的例子中,我们将尝试实现一个聊天应用程序,用户可以在其中进行群聊。每个用户都将通过其名称进行识别,他们可以发送和接收消息。任何用户发送的消息都应该由组中的所有其他用户接收。
中介者模式接口
首先,我们将创建 Mediator 接口,为具体中介者定义契约。ChatMediator.java
package com.journaldev.design.mediator;
public interface ChatMediator {
public void sendMessage(String msg, User user);
void addUser(User user);
}
中介模式同事接口
用户可以发送和接收消息,因此我们可以拥有用户界面或抽象类。我将用户创建为抽象类,如下所示。User.java
package com.journaldev.design.mediator;
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator med, String name){
this.mediator=med;
this.name=name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
请注意,User 有一个对中介对象的引用,它是不同用户之间通信所必需的。
具体中介者
现在我们将创建具体的中介类,它将拥有组中的用户列表并为用户之间的沟通提供逻辑。ChatMediatorImpl.java
package com.journaldev.design.mediator;
import java.util.ArrayList;
import java.util.List;
public class ChatMediatorImpl implements ChatMediator {
private List<User> users;
public ChatMediatorImpl(){
this.users=new ArrayList<>();
}
@Override
public void addUser(User user){
this.users.add(user);
}
@Override
public void sendMessage(String msg, User user) {
for(User u : this.users){
//message should not be received by the user sending it
if(u != user){
u.receive(msg);
}
}
}
}
中介者设计模式 具体同事
现在我们可以创建具体的用户类供客户端系统使用。UserImpl.java
package com.journaldev.design.mediator;
public class UserImpl extends User {
public UserImpl(ChatMediator med, String name) {
super(med, name);
}
@Override
public void send(String msg){
System.out.println(this.name+": Sending Message="+msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(this.name+": Received Message:"+msg);
}
}
请注意,send() 方法使用中介将消息发送给用户,并且它不知道中介将如何处理该消息。
中介模式示例客户端程序代码
让我们用一个简单的程序来测试我们的聊天应用程序,我们将创建中介并将用户添加到组中,然后其中一个用户将发送一条消息。ChatClient.java
package com.journaldev.design.mediator;
public class ChatClient {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediatorImpl();
User user1 = new UserImpl(mediator, "Pankaj");
User user2 = new UserImpl(mediator, "Lisa");
User user3 = new UserImpl(mediator, "Saurabh");
User user4 = new UserImpl(mediator, "David");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("Hi All");
}
}
请注意,客户端程序非常简单,它不知道消息如何处理,也不知道中介是否得到用户的关注。中介模式示例程序的输出为:
Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All
中介者模式类图
JDK 中的中介模式示例
- java.util.Timer类 scheduleXXX() 方法
- Java 并发执行器execute() 方法。
- java.lang.reflect.Methodinvoke()方法。
中介设计模式重点
- 当对象之间的通信逻辑复杂时,中介模式很有用,我们可以有一个负责通信逻辑的中心通信点。
- Java 消息服务 (JMS) 使用中介模式和观察者模式来允许应用程序订阅和发布数据到其他应用程序。
- 我们不应该仅仅为了实现松耦合而使用中介模式,因为如果中介的数量增加,那么维护它们就会变得困难。
这就是中介设计模式及其在 Java 中的实现。