设计模式--中介者模式【行为型模式】

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

设计模式系列文章传送门

设计模式的 7 大原则

设计模式--单例模式【创建型模式】

设计模式--工厂方法模式【创建型模式】

设计模式--抽象工厂模式【创建型模式】

设计模式--建造者模式【创建型模式】

设计模式--原型模式【创建型模式】

设计模式--适配器模式【结构型模式】

设计模式--装饰器模式【结构型模式】

设计模式--代理模式【结构型模式】

设计模式--外观模式(门面模式)【结构型模式】

设计模式--桥接模式【结构型模式】

设计模式--组合模式【结构型模式】

设计模式--享元模式【结构型模式】

设计模式--策略模式【行为型模式】

设计模式--模板方法模式【行为型模式】

设计模式--观察者模式【行为型模式】

设计模式--迭代器模式【行为型模式】

设计模式--责任链模式【行为型模式】

设计模式--命令模式【行为型模式】

设计模式--备忘录模式【行为型模式】

设计模式--状态模式【行为型模式】

设计模式--访问者模式【行为型模式】

什么是中介者模式

中介者模式(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元

可以看到我们并没有直接调用支付宝、微信、云闪付支付,而是通过中介者实现的,但最终还是正常完成了支付,结果符合预期。

中介者模式的优缺点

优点:

  • 解耦了对象之间的直接依赖关系,客户端只需要与中介者交互,由中介者来调用对应的方法,完成业务逻辑。
  • 对象之间的通信通过中介者进行,当系统需要添加新的对象或者修改对象之间的交互方式时,只需要在中介者类中进行相应的修改,而不需要在多个相关对象中进行复杂的修改,提升了代码的可维护性。
  • 降低了对象之间相互调用的复杂度,将一对多的调用关系转换为了一对一的调用关系,客户端只需要关注与中介者的交互。
  • 中介者将系统中的对象的交互行为集中控制在中介者对象中,这可以更好地管理和控制系统中对象的行为,让系统更加结构化。

缺点:

  • 中介者模式的实现较为复杂,对系统研发人员有较高的要求。
  • 在某种程度上来说降低了对象的复用性,因为中介者模式将对象封装起来了,对象的访问依赖于中介者。

中介者模式的使用场景

  • 系统中的对象之间存在复杂的交互行为,可以考虑使用中介者模式。
  • 希望通过减少对象之间的直接耦合来提高系统的灵活性和可扩展性时,可以考虑使用中介者模式。
  • 当需要对对象之间的交互进行集中管理和控制时,可以考虑使用中介者模式。

总结:本篇分享了中介者设计模式的相关知识,个人感觉中介者模式还是有一点复杂的,我使用了支付场景的案例进行了代码演示,希望可以帮助到不太熟悉中介者模式的朋友。

如有不正确的地方欢迎各位指出纠正。

相关推荐
一介草民丶14 分钟前
技术总结 | MySQL面试知识点
java·数据库·mysql
BUG研究员_20 分钟前
JVM深入理解
java·jvm·学习
shuair2 小时前
idea 2023.3.7常用插件
java·ide·intellij-idea
小安同学iter2 小时前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
Yvonne9782 小时前
创建三个节点
java·大数据
不会飞的小龙人3 小时前
Kafka消息服务之Java工具类
java·kafka·消息队列·mq
是小崔啊4 小时前
java网络编程02 - HTTP、HTTPS详解
java·网络·http
brevity_souls4 小时前
Spring Boot 内置工具类
java·spring boot
小钊(求职中)5 小时前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
shix .5 小时前
什么是tomcat
java·tomcat