Java中介者模式深度解析:简化复杂系统交互

中介者设计模式是行为设计模式之一,它处理对象的行为。中介者设计模式用于为系统中的不同对象提供一个集中的沟通媒介。

中介者设计模式详解

根据《设计模式》的解释,中介者模式的目的是:

通过封装不同对象之间的交互和通信方式,实现了松耦合。使得每个对象集合的动作可以独立于其他对象集合进行变化。

中介者设计模式在企业应用中非常有帮助,尤其是在多个对象相互交互的情况下。如果对象直接相互交互,系统组件之间就会紧密耦合,这会增加维护成本并且不易扩展。中介者模式专注于为对象提供通信中介,并帮助实现对象之间的松耦合。航空交通管制员是中介者模式的一个很好的例子,机场控制室作为不同航班之间通信的中介。中介者在对象之间充当路由器的角色,并且可以有自己的逻辑来提供通信方式。相互通信的系统对象称为“同事”。通常我们有一个接口或抽象类来提供通信约定,然后我们有中介者的具体实现。对于我们的示例,我们将尝试实现一个聊天应用程序,用户可以进行群聊。每个用户将通过其名称进行标识,他们可以发送和接收消息。任何用户发送的消息都应该被群组中的所有其他用户接收到。

中介者模式接口

首先,我们将创建一个Mediator接口,用于定义具体中介者的契约。文件名为 ChatMediator.java

package com.Olivia.design.mediator;

public interface ChatMediator {
	public void sendMessage(String msg, User user);
	void addUser(User user);
}

中介者模式同事接口

用户可以发送和接收消息,因此我们可以有用户界面或抽象类。我正在创建一个名为 User.java 的抽象类,如下所示。

package com.Olivia.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.Olivia.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){
			//消息不应发送给发送者本人
			if(u != user){
				u.receive(msg);
			}
		}
	}

}

中介者设计模式具体同事实现

现在我们可以创建具体的用户类,供客户端系统使用。文件名为 UserImpl.java

package com.Olivia.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+": 发送消息="+msg);
		mediator.sendMessage(msg, this);
	}
	@Override
	public void receive(String msg) {
		System.out.println(this.name+": 接收消息:"+msg);
	}

}

请注意,send() 方法使用中介者将消息发送给用户,并且不知道中介者会如何处理该消息。

中介者模式示例客户端程序代码

让我们使用一个简单的程序来测试我们的聊天应用,创建一个中介并将用户添加到群组中,其中一个用户将发送一条消息。文件名为 ChatClient.java

package com.Olivia.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("大家好");
		
	}

}

请注意,客户端程序非常简单,对于消息的处理方式以及中介者是否获取用户并没有任何了解。中介者模式示例程序的输出是:

Pankaj: 发送消息=大家好
Lisa: 接收消息:大家好
Saurabh: 接收消息:大家好
David: 接收消息:大家好

中介者模式类图

中介者模式类图

JDK 中的中介者模式示例

  • java.util.Timer 类的 scheduleXXX() 方法。
  • Java 并发包中 Executorexecute() 方法。
  • java.lang.reflect.Methodinvoke() 方法。

中介者设计模式的重要要点

  • 当对象之间的通信逻辑复杂时,中介者模式非常有用,我们可以有一个集中的通信点来处理通信逻辑。
  • Java 消息服务 (JMS) 结合观察者模式使用中介者模式,允许应用程序订阅和发布数据到其他应用程序。
  • 我们不应该仅仅为了实现松耦合而使用中介者模式,因为如果中介者的数量增加,维护它们将变得困难。

关于中介者设计模式及其在 Java 中的实现就介绍到这里了。

bannerAds