Java中的中介器设计模式
中介者设计模式是行为设计模式之一,因此它处理对象的行为。
中介器设计模式用于在系统中不同对象之间提供集中式通信介质。
中介者设计模式
根据GoF,中介者模式意图是:
通过封装不同对象集相互交互和通信的方式,允许松散耦合。
允许每个对象集的动作彼此独立地变化。
Mediator设计模式在企业应用程序中非常有用,在该应用程序中多个对象相互交互。
如果对象直接相互交互,则系统组件彼此紧密耦合,这将导致较高的可维护性成本,并且很难扩展。
调解器模式致力于在对象之间提供调解器以进行通信,并帮助实现对象之间的损耗耦合。
空中交通管制员是调解员模式的一个很好的例子,其中机场控制室充当不同航班之间通信的调解员。
中介器充当对象之间的路由器,并且可以具有自己的逻辑来提供通信方式。
相互通信的系统对象称为同事。
通常,我们有一个提供通信契约的接口或者抽象类,然后我们有介体的具体实现。
对于我们的示例,我们将尝试实现一个聊天应用程序,用户可以其中进行群聊。
每个用户的名字都会被标识出来,他们可以发送和接收消息。
任何用户发送的消息都应被组中的所有其他用户接收。
介体模式界面
首先,我们将创建Mediator接口,该接口将为具体的调解人定义合同。
ChatMediator.java
package com.theitroad.design.mediator; public interface ChatMediator { public void sendMessage(String msg, User user); void addUser(User user); }
调解人模式同事界面
用户可以发送和接收消息,因此我们可以具有用户界面或者抽象类。
我创建用户作为抽象类,如下所示。
User.java
package com.theitroad.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); }
请注意,用户具有对中介者对象的引用,这是不同用户之间进行通信所必需的。
混凝土调解员
现在,我们将创建具体的调解器类,它将在组中具有用户列表,并为用户之间的通信提供逻辑。
ChatMediatorImpl.java
package com.theitroad.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.theitroad.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.theitroad.design.mediator; public class ChatClient { public static void main(String[] args) { ChatMediator mediator = new ChatMediatorImpl(); User user1 = new UserImpl(mediator, "hyman"); 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"); } }
请注意,客户端程序非常简单,并且不知道如何处理消息以及调解员是否正在获得用户。
中介者模式示例程序的输出为:
hyman: 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.Method invoke()方法。
介体设计模式要点
当对象之间的通信逻辑复杂时,调解器模式很有用,我们可以拥有一个通信的中心点来处理通信逻辑。
Java消息服务(JMS)使用Mediator模式和Observer模式来允许应用程序将数据订阅和发布到其他应用程序。
我们不应该仅仅使用调解器模式来实现损失耦合,因为如果调解器的数量增加,那么将很难维持它们。