调解器设计模式是行为设计模式之一,因此它涉及对象的行为模式。
媒介设计模式
According to GoF, mediator pattern intent is:
允许通过封装不同对象集相互作用和相互通信的方式进行松散的配对,允许每个对象集的行动相互独立地变化。
中介设计模式在多个对象相互相互作用的企业应用程序中非常有用. 如果物体直接相互作用,系统组件相互紧密相接,使可维护性成本较高,不难扩展. 调解人模式的重点是在通信对象之间提供调解人,并帮助实现目标之间的损失联系。 空中交通管制员是调解模式的一个范例,机场管制室充当不同航班之间沟通的调解人。 调解人在对象之间充当路由器,它可以有自己的逻辑来提供交流方式. 互相交流的系统对象称为Colleagues. 通常我们有一个界面或抽象类,提供交流合同,然后我们具体执行调解人。 以我们为例,我们将尝试实施一个聊天应用程序,让用户可以进行分组聊天. 每个用户都会被它的名字识别出来,他们可以发送和接收消息. 任何用户发送的信息应当被组内所有其他用户接收.
媒介模式接口
首先,我们将创建调解员界面,该界面将定义具体调解员的合同。
1package com.journaldev.design.mediator;
2
3public interface ChatMediator {
4
5 public void sendMessage(String msg, User user);
6
7 void addUser(User user);
8}
调解员模型 同事界面
用户可以发送和接收消息,所以我们可以有用户界面或抽象类。
1package com.journaldev.design.mediator;
2
3public abstract class User {
4 protected ChatMediator mediator;
5 protected String name;
6
7 public User(ChatMediator med, String name){
8 this.mediator=med;
9 this.name=name;
10 }
11
12 public abstract void send(String msg);
13
14 public abstract void receive(String msg);
15}
请注意,用户对中介对象有引用,对于不同用户之间的沟通是必要的。
具体调解员
现在我们将创建具体的调解员类,它将有组中的用户列表,并为用户之间的沟通提供逻辑。
1package com.journaldev.design.mediator;
2
3import java.util.ArrayList;
4import java.util.List;
5
6public class ChatMediatorImpl implements ChatMediator {
7
8 private List<User> users;
9
10 public ChatMediatorImpl(){
11 this.users=new ArrayList<>();
12 }
13
14 @Override
15 public void addUser(User user){
16 this.users.add(user);
17 }
18
19 @Override
20 public void sendMessage(String msg, User user) {
21 for(User u : this.users){
22 //message should not be received by the user sending it
23 if(u != user){
24 u.receive(msg);
25 }
26 }
27 }
28
29}
调解员设计模型 具体同事
现在我们可以创建具体的用户类,用于客户端系统。
1package com.journaldev.design.mediator;
2
3public class UserImpl extends User {
4
5 public UserImpl(ChatMediator med, String name) {
6 super(med, name);
7 }
8
9 @Override
10 public void send(String msg){
11 System.out.println(this.name+": Sending Message="+msg);
12 mediator.sendMessage(msg, this);
13 }
14 @Override
15 public void receive(String msg) {
16 System.out.println(this.name+": Received Message:"+msg);
17 }
18
19}
请注意, send() 方法正在使用中介器将消息发送给用户,它不知道中介器将如何处理。
调解员模型 客户端程序代码
让我们用一个简单的程序来测试我们的聊天应用程序,我们将创建调解员,并将用户添加到组中,其中一个用户将发送消息。
1package com.journaldev.design.mediator;
2
3public class ChatClient {
4
5 public static void main(String[] args) {
6 ChatMediator mediator = new ChatMediatorImpl();
7 User user1 = new UserImpl(mediator, "Pankaj");
8 User user2 = new UserImpl(mediator, "Lisa");
9 User user3 = new UserImpl(mediator, "Saurabh");
10 User user4 = new UserImpl(mediator, "David");
11 mediator.addUser(user1);
12 mediator.addUser(user2);
13 mediator.addUser(user3);
14 mediator.addUser(user4);
15
16 user1.send("Hi All");
17
18 }
19
20}
请注意,客户端程序非常简单,它不知道该消息是如何处理的,以及中介者是否正在获得用户。
1Pankaj: Sending Message=Hi All
2Lisa: Received Message:Hi All
3Saurabh: Received Message:Hi All
4David: Received Message:Hi All
调解员模型班级图
JDK 中介模式示例
- java.util.Timer 类时间表XXX() 方法
- Java Concurrency Executor 执行() 方法.
- java.lang.reflect.Method invoke() 方法.
调解员设计模式重要点
在对象之间的通信逻辑复杂时,中介器模式是有用的,我们可以有一个处理通信逻辑的中心通信点 *Java Message Service(JMS)使用中介器模式以及 **观察者模式**允许应用程序向其他应用程序订阅和发布数据 *我们不应该使用中介器模式只是为了实现损失连接,因为如果中介者的数量会增加,那么将很难维持它们
这就是中介设计模式的全部,它是在Java中实现的。