在软件开发过程中,我们经常会遇到一些复杂的问题,例如需要处理的对象之间的依赖关系、多个对象之间的交互等,为了解决这些问题,软件开发人员提出了许多设计模式,中介者模式是一种非常有用的设计模式,它可以帮助我们简化系统中的复杂性,提高代码的可读性和可维护性。
中介者模式主要包括以下几个部分:
1、抽象主题(Subject):定义了一组操作,这些操作由其他对象执行,抽象主题可以看作是一个高层接口,它为子系统中的其他对象提供了统一的操作方式。
2、具体主题(ConcreteSubject):实现了抽象主题中定义的操作,具体主题是抽象主题的实现,它包含了具体的业务逻辑。
3、中介者(Mediator):负责协调各个具体主题之间的交互,中介者可以理解为一个中间层,它位于抽象主题和具体主题之间,负责封装它们的交互细节。
4、抽象中介者(AbstractMediator):定义了中介者的行为规范,但不包含具体的实现,抽象中介者可以被具体中介者继承,以实现特定的功能。
5、具体中介者(ConcreteMediator):实现了抽象中介者中定义的行为规范,并负责协调各个具体主题之间的交互。
通过使用中介者模式,我们可以将系统中的复杂性分离到不同的层次,使得每个层次只关注自己的职责,这样,当系统发生变化时,我们只需要修改相应的层次,而不需要修改整个系统的结构,这大大提高了代码的可扩展性和可维护性。
下面我们通过一个实例来说明中介者模式的应用:
假设我们正在开发一个在线购物系统,系统中有一个订单管理模块,负责处理用户的订单请求,在这个模块中,我们需要处理以下几个问题:
1、当用户下单时,需要创建一个新的订单对象;
2、当订单状态发生变化时,需要更新订单对象的状态;
3、当订单完成支付时,需要通知其他相关的系统模块;
4、当收到退款请求时,需要根据订单的状态来判断是否同意退款。
为了解决这些问题,我们可以使用中介者模式来设计订单管理模块,我们定义一个抽象的主题类Order
,它包含了订单的基本操作:
public interface Order { void createOrder(); // 创建订单 void updateOrderStatus(); // 更新订单状态 void completePayment(); // 完成支付 void applyRefund(); // 申请退款 }
我们定义两个具体的主题类:ConcreteOrderA
和ConcreteOrderB
,分别表示两种不同的订单类型:普通订单和限时抢购订单,这两个类实现了Order
接口的具体方法:
public class ConcreteOrderA implements Order { @Override public void createOrder() { // 实现创建订单的逻辑 } @Override public void updateOrderStatus() { // 实现更新订单状态的逻辑 } @Override public void completePayment() { // 实现完成支付的逻辑 } @Override public void applyRefund() { // 实现申请退款的逻辑 } }
我们定义一个抽象的中介者类OrderMediator
,它负责协调ConcreteOrderA
和ConcreteOrderB
之间的交互:
public abstract class OrderMediator implements Order { private ConcreteOrderA orderA; // 限时抢购订单对象 private ConcreteOrderB orderB; // 普通订单对象 public OrderMediator(ConcreteOrderA orderA, ConcreteOrderB orderB) { this.orderA = orderA; this.orderB = orderB; } }
我们定义两个具体的中介者类:ConcreteOrderMediatorA
和ConcreteOrderMediatorB
,分别表示两种不同的订单类型的中介者:限时抢购订单和普通订单的中介者,这两个类实现了OrderMediator
接口的方法:
public class ConcreteOrderMediatorA extends OrderMediator { public ConcreteOrderMediatorA(ConcreteOrderA orderA, ConcreteOrderB orderB) { super(orderA, orderB); } @Override public void createOrder() { // 实现创建订单的逻辑,同时通知限时抢购订单和普通订单的相关操作 } }