在软件开发中,我们经常会遇到这样的问题:一个模块需要与另一个模块紧密地交互,但是它们的接口并不清晰,这种情况下,如果我们直接修改其中一个模块的代码,可能会导致另一个模块出现不可预知的问题,为了解决这个问题,我们可以使用一种被称为“中介者模式”的设计模式。
中介者模式是一种结构型设计模式,它提供了一种在各个对象之间插入一个中介者对象的方法,以便于控制对这些对象的访问,通过使用中介者模式,我们可以在不修改原始类的情况下,增加新的操作,从而降低系统之间的耦合度。
在中介者模式中,主要涉及到三个角色:抽象主题(Subject)、抽象中介者(Mediator)和具体中介者(ConcreteMediator),抽象主题是指与其进行交互的对象,抽象中介者是定义了操作但没有实现的接口,具体中介者则是实现了接口的具体类。
下面我们通过一个简单的例子来说明中介者模式的用法:
假设我们有一个在线书店系统,它包括了用户(User)、书籍(Book)和订单(Order)三个部分,在这个系统中,用户可以查看他们的订单,订单可以支付并更新状态,为了实现这个功能,我们需要在用户和订单之间引入一个中介者——支付网关(PaymentGateway)。
我们定义一个抽象主题接口PaymentGateway:
public interface PaymentGateway { void pay(Order order); }
我们创建两个具体中介者类:支付宝支付(Alipay)和微信支付(WechatPay):
public class Alipay implements PaymentGateway { @Override public void pay(Order order) { // 实现支付宝支付的逻辑 } } public class WechatPay implements PaymentGateway { @Override public void pay(Order order) { // 实现微信支付的逻辑 } }
我们在订单类中引入一个支付网关对象,并提供一个方法来设置这个对象:
public class Order { private PaymentGateway paymentGateway; public void setPaymentGateway(PaymentGateway paymentGateway) { this.paymentGateway = paymentGateway; } public void pay() { if (paymentGateway != null) { paymentGateway.pay(this); } else { System.out.println("未设置支付网关"); } } }
在用户类中,我们可以通过调用订单对象的pay方法来实现支付功能:
public class User { private List<Order> orders; public void createOrder() { Order order = new Order(); // ...设置订单属性... orders.add(order); } }
通过以上步骤,我们成功地将用户、书籍和订单这三个对象解耦,使得它们之间的交互更加灵活,当需要添加新的支付方式时,我们只需要实现一个新的具体中介者类即可,而不需要修改原有的代码,这就是中介者模式的优势所在。