持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
中介者模式是一种行为设计模式,所以它是用来处理对象的行为。中介者设计模式在系统重为不同的对象提供一种中心化的通信媒介
中介者设计模式
根据GOF,中介者模式的意图是;
通过低耦合的封装实现方式来隔离一系列的对象间的交互和通信。允许每个对象集之间彼此独立变化
中介者模式在一个拥有多个对象且需要相互交互的企业级应用里会很有用。如果一个对象直接和其他的对象进行交互,系统组件间的耦合会变高,增加了维护成本并且不容易扩展。中介者模式在各个对象间提供一个低耦合的中介者进行通信
空中交通控制就是一个很好的中介者例子,机场控制室就是一个中介者来提供不同的航班之间的通信。中介者像不同对象间的一个路由器,并且提供自己的通信逻辑
系统里相互通信的对象我们成为成员(Colleagues),通常情况下我们用接口或者抽象类来提供通信的协议,并且我们通过实现接口或者抽象类来构建中介者
在我们的例子中,我们尝试实现一个聊天应用,用户可以实现在一个聊天室进行聊天。每个用户通过用户名来标识,他们可以发送或者接收消息。发送的消息可以被组里的其他用户收到
中介者接口
首先,我们创建一个中介者接口,来定义构建中介者的协议约定
ChatMediator.java
package com.journaldev.design.mediator;
public interface ChatMediator {
public void sendMessage(String msg, User user);
void addUser(User 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里有一个中介者对象的引用,它用来进行对象间的通信
构建中介者
现在我们来创建一个中介者类。它将有在一个组里的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);
}
}
}
}
构建中介者成员
现在我们构建具体User 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()方法使用了Mediator的 sendMessage()方法来发送消息给其他的用户,User本身并不知道怎么处理发送消息
中介者模式例子客户代码
让我们用一个简单的例子来测试我们的聊天系统,这儿我们创建一个中介者并且添加用户到一个组里,并且其中的一个用户进行消息发送
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 class scheduleXXX() methods
- Java Concurrency Executor execute() method.
- java.lang.reflect.Method invoke() method.
中介者模式重要点
- 在对象之间的通信逻辑比较复杂时,中介者模式比较有用,我们可以有一个通信中心来关注通信逻辑
- Java Message Service (JMS)使用终结者模式和观察者模式,允许应用之间来订阅和发布数据
- 我们不应该使用终结者模式如果仅仅为了解耦,因为随着中介者数量增加,也会变得越来越难以维护
上面就是中介者模式在java中的实现