Java中的中介者设计模式

中介者设计模式是行为设计模式之一,因此它涉及对象的行为。中介者设计模式用于提供系统中不同对象之间的集中式通信媒介。

中介者设计模式

根据GoF,中介者模式的目的是:

通过封装不同对象集交互和通信的方式,实现松耦合。允许每个对象集的操作独立变化,互不影响。

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

中介者模式接口

首先,我们将创建中介者接口,该接口将定义具体中介者的契约。ChatMediator.java

package com.journaldev.design.mediator;

public interface ChatMediator {

	public void sendMessage(String msg, User user);

	void addUser(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);
}

请注意,用户具有对中介对象的引用,这对于不同用户之间的通信是必需的。

具体中介者

现在我们将创建具体的中介者类,它将拥有组中用户的列表并提供用户之间通信的逻辑。 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