Java 中的 Mediator 設計模式

調解者設計模式是行為設計模式之一,它處理對象的行為。調解者設計模式用於在系統中不同對象之間提供一個集中的通信媒介。

調解者設計模式

根據GoF,調解者模式的意圖是:

通過封裝不同對象之間的交互和通信方式,實現鬆散耦合。使得每個對象集合的操作可以獨立於其他對象集合而變化。

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

中介者模式接口

首先,我们将创建中介者接口,用于定义具体中介者的契约。 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类引用了中介者对象,这对于不同用户之间的通信是必需的。

具体中介者

现在我们将创建具体的中介者类,它将拥有用户列表并提供用户之间通信的逻辑。ChatMediatorImpl.java

package com.journaldev.design.mediator;

import java.util.ArrayList;
import java.util.List;

public class ChatMediatorImpl implements ChatMediator {

	private List 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.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消息服务(JMS)使用中介者模式和观察者模式,允许应用程序订阅和发布数据给其他应用程序。
  • 我们不应该仅仅为了实现松耦合而使用中介者模式,因为如果中介者的数量增加,那么它们的维护将变得困难。

这就是关于中介者设计模式及其在Java中的实现的全部内容。

Source:
https://www.digitalocean.com/community/tutorials/mediator-design-pattern-java