设计模式的分类
我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:
- 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
- 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式系列文章传送门
什么是中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过使用一个中介对象来封装一系列对象之间的交互方式,中介者使得各对象之间不需要显式地相互引用,从而降低对象之间的耦合度,使得系统可以更加灵活地进行维护和扩展,中介者模式的本质其实就是封装对象之间的交互过程。
中介者模式的组成部分
- 抽象中介者:定义了通用接口,用于与各个同事对象进行通信。这个接口通常包含了同事对象之间交互的方法。
- 具体中介者:实现了抽象中介者的接口,它包含了对各个同事对象的引用,并通过协调这些同事对象来实现具体的交互逻辑。
- 抽象同事类:定义了同事对象的接口,每个同事对象都需要实现这个接口,并且在接口中定义了同事对象与中介者进行通信的方法。
- 具体同事类:实现了抽象同事类的接口,每个具体同事类代表一个实际的对象,它们通过中介者来与其他同事对象进行交互。
中介者模式案例演示
中介者模式在生活中也有很多应用场景,例如物流公司、商家、用户等的场景,网购支付的场景,有支付宝、微信、云闪付支付,用户只需要发起支付,由支付平台调用支付宝、微信、云闪付支付,这其中支付平台就是中介者的角色,支付宝、微信、云闪付就是具体的同事类,下面我们使用代码来演示这个网购支付场景这个案例。
PayMediator(抽象中介者)
PayMediator 中介者定义了注册支付方式和付款的接口,具体代码如下:
java
public interface PayMediator {
//注册付款方式
void registerPayMethod(PayMethod payMethod);
//付款
void payment(String payMethodName, int amount);
}
PayMediatorImpl(具体中介者)
PayMediatorImpl 中介者实现了抽象中介者,持有一个支付方式的容器,并重写了注册支付方式和付款的接口,具体代码如下:
java
public class PayMediatorImpl implements PayMediator{
//支付方式容器
private Map<String,PayMethod> payMethodMap=new HashMap<>();
@Override
public void registerPayMethod(PayMethod payMethod) {
payMethodMap.put(payMethod.getPayMethodName(),payMethod);
}
@Override
public void payment(String payMethodName, int amount) {
PayMethod payMethod = payMethodMap.get(payMethodName);
//发起支付
payMethod.payProcess(amount);
}
}
PayMethod(抽象同事类)
PayMethod 支付方式,也就是抽象同事类,具体代码如下:
java
public abstract class PayMethod {
private String payMethodName;
public String getPayMethodName() {
return payMethodName;
}
public void setPayMethodName(String payMethodName) {
this.payMethodName = payMethodName;
}
public PayMethod( String payMethodName) {
this.payMethodName = payMethodName;
}
//处理付款 金额
public abstract void payProcess(int amount);
}
Alipay(具体同事类)
Alipay 支付宝支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:
java
public class Alipay extends PayMethod {
public Alipay(String payMethodName) {
super(payMethodName);
}
@Override
public void payProcess(int amount) {
System.out.println("支付宝支付:" + amount + "元");
}
}
WeChatPay(具体同事类)
WeChatPay 微信支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:
java
public class WeChatPay extends PayMethod {
public WeChatPay(String payMethodName) {
super(payMethodName);
}
@Override
public void payProcess(int amount) {
System.out.println("微信支付:" + amount + "元");
}
}
CloudQuickPassPay(具体同事类)
CloudQuickPassPay 云闪付支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:
java
public class CloudQuickPassPay extends PayMethod {
public CloudQuickPassPay(String payMethodName) {
super(payMethodName);
}
@Override
public void payProcess(int amount) {
System.out.println("云闪付支付:" + amount + "元");
}
}
MediatorClient(客户端)
MediatorClient 代码如下:
java
public class MediatorClient {
public static void main(String[] args) {
//访问者
PayMediatorImpl payMediator = new PayMediatorImpl();
//支付宝支付
Alipay alipay = new Alipay("支付宝");
//微信支付
WeChatPay weChatPay = new WeChatPay("微信");
//云闪付支付
CloudQuickPassPay cloudQuickPassPay = new CloudQuickPassPay("云闪付");
//注册支付宝支付
payMediator.registerPayMethod(alipay);
//注册微信支付
payMediator.registerPayMethod(weChatPay);
//注册云闪付支付
payMediator.registerPayMethod(cloudQuickPassPay);
//中介者调用支付宝支付
payMediator.payment("支付宝", 10);
//中介者调用微信支付
payMediator.payment("微信", 100);
//中介者调用云闪付支付
payMediator.payment("云闪付", 1000);
}
}
执行结果如下:
powershell
支付宝支付:10元
微信支付:100元
云闪付支付:1000元
可以看到我们并没有直接调用支付宝、微信、云闪付支付,而是通过中介者实现的,但最终还是正常完成了支付,结果符合预期。
中介者模式的优缺点
优点:
- 解耦了对象之间的直接依赖关系,客户端只需要与中介者交互,由中介者来调用对应的方法,完成业务逻辑。
- 对象之间的通信通过中介者进行,当系统需要添加新的对象或者修改对象之间的交互方式时,只需要在中介者类中进行相应的修改,而不需要在多个相关对象中进行复杂的修改,提升了代码的可维护性。
- 降低了对象之间相互调用的复杂度,将一对多的调用关系转换为了一对一的调用关系,客户端只需要关注与中介者的交互。
- 中介者将系统中的对象的交互行为集中控制在中介者对象中,这可以更好地管理和控制系统中对象的行为,让系统更加结构化。
缺点:
- 中介者模式的实现较为复杂,对系统研发人员有较高的要求。
- 在某种程度上来说降低了对象的复用性,因为中介者模式将对象封装起来了,对象的访问依赖于中介者。
中介者模式的使用场景
- 系统中的对象之间存在复杂的交互行为,可以考虑使用中介者模式。
- 希望通过减少对象之间的直接耦合来提高系统的灵活性和可扩展性时,可以考虑使用中介者模式。
- 当需要对对象之间的交互进行集中管理和控制时,可以考虑使用中介者模式。
总结:本篇分享了中介者设计模式的相关知识,个人感觉中介者模式还是有一点复杂的,我使用了支付场景的案例进行了代码演示,希望可以帮助到不太熟悉中介者模式的朋友。
如有不正确的地方欢迎各位指出纠正。