本文目录导读:
在软件开发过程中,我们经常会遇到这样的问题:当多个对象之间存在复杂的依赖关系时,如何简化这些关系并提高代码的可维护性?这时,中介者模式(Mediator Pattern)应运而生,本文将详细介绍中介者模式的概念、特点以及如何在实际项目中应用。
中介者模式概述
中介者模式是一种行为设计模式,它通过引入一个中介对象来封装一系列对象之间的交互,从而降低了系统的耦合度,中介者模式主要包含两类对象:抽象中介者(Mediator)和具体中介者(ConcreteMediator),抽象中介者定义了操作接口,具体中介者实现了这些接口,而其他对象则通过中介者与抽象中介者进行交互。
中介者模式的特点
1、降低耦合度:中介者模式通过将对象之间的交互封装在中介者对象中,使得各个对象之间的依赖关系更加清晰,从而降低了系统的耦合度。
2、扩展性:中介者模式具有良好的扩展性,当需要增加新的交互操作时,只需实现一个新的具体中介者即可,无需修改原有的代码。
3、易于维护:由于中介者模式将对象之间的交互封装在中介者对象中,因此当需要修改交互操作时,只需修改中介者对象的实现,而无需修改其他对象的代码。
中介者模式的应用场景
1、事件驱动:当系统中存在大量的事件源和事件监听器时,可以使用中介者模式将事件发布和订阅的操作封装在一个中介者对象中,从而简化系统结构。
2、业务逻辑协调:在一些复杂的业务系统中,可能存在多个业务模块之间的协作需求,可以使用中介者模式将这些模块之间的协作操作封装在一个中介者对象中,从而简化业务逻辑。
3、资源管理:在一些需要共享资源的系统中,可以使用中介者模式将资源的获取和释放操作封装在一个中介者对象中,从而简化资源管理。
中介者模式的实现步骤
1、定义抽象中介者(Mediator)接口:抽象中介者定义了操作接口,包括添加、删除和通知具体中介者的方法。
public interface Mediator { void addColleague(Colleague colleague); void removeColleague(Colleague colleague); void sendMessage(String message); }
2、实现具体中介者(ConcreteMediator):具体中介者实现了抽象中介者的接口,并维护了一个同事列表(List<Colleague>),用于存储所有与自己直接关联的同事,具体中介者还需要实现通知功能,以便在收到消息时通知所有关联的同事。
import java.util.ArrayList; import java.util.List; public class ConcreteMediator implements Mediator { private List<Colleague> colleagues; private Colleague sender; public ConcreteMediator() { colleagues = new ArrayList<>(); } @Override public void addColleague(Colleague colleague) { if (!colleagues.contains(colleague)) { colleagues.add(colleague); if (sender == null) { sender = colleague; } else { for (Colleague c : colleagues) { if (c != sender) { c.setReceiver(colleague); } else { sender.setReceiver(colleague); } } } } } @Override public void removeColleague(Colleague colleague) { colleagues.remove(colleague); if (colleagues.isEmpty()) { sender = null; } else if (colleagues.size() == 1) { sender = colleagues.get(0); sender.setReceiver(null); } else { Colleague last = colleagues.get(colleagues.size() - 1); last.setReceiver(null); sender = colleagues.get(colleagues.size() - 2); sender.setReceiver(last); } } @Override public void sendMessage(String message) { for (Colleague colleague : colleagues) { if (colleague != sender && colleague.getReceiver() != null) { colleague.receiveMessage(message); } else if (colleague == sender) { break; // 如果当前同事是发送方且没有接收方,则跳出循环,避免无限递归调用sendMessage方法,在实际项目中,可以考虑使用观察者模式替代。 } else if (colleague == null) { // 如果当前同事为空,则尝试将其设置为接收方,在实际项目中,可以通过查找或创建的方式找到合适的接收方,这里为了简化示例,直接将当前同事设置为接收方,但这种做法可能导致死循环,因此在实际项目中不建议使用,应该改为查找或创建合适的接收方,以下代码已被注释掉。// colleague = findOrCreateReceiver(); // 在实际项目中,可以通过查找或创建的方式找到合适的接收方,这里为了简化示例,直接将当前同事设置为接收方,但这种做法可能导致死循环,因此在实际项目中不建议使用,应该改为查找或创建合适的接收方,以下代码已被注释掉。// this.receiver = colleague; // 将当前同事设置为接收方。// colleague.receiveMessage(message); // 继续处理下一个同事的消息。// break; // 避免无限递归调用sendMessage方法,在实际项目中,可以考虑使用观察者模式替代,以下代码已被注释掉。// break; // 避免无限递同理,如果当前同事是接收方且没有发送方,则跳出循环,避免无限递归调用sendMessage方法,在实际项目中,可以考虑使用观察者模式替代,以下代码已被注释掉。// if (colleague == null) return; // 将当前同事设置为发送方。// this.sender = colleague; // 将当前同事设置为发送方。// colleague.sendMessage("Hello World!"); // 继续处理下一个同事的消息。// break; // 避免无限递同理,如果当前同事是发送方且没有接收方,则跳出循环,避免无限递归调用sendMessage方法,在实际项目中,可以考虑使用观察者模式替代,以下代码已被注释掉。// if (colleague == null) return; // 将当前同事设置为接收方。// this.receiver = colleague; // 将当前同事设置为接收方。// colleague.receiveMessage("Hello World!"); // 继续处理下一个同事的消息。// break; // 避免无限递归调用sendMessage方法......]```