Java设计模式之中介模式

 更新时间:2023年12月29日 10:11:39   作者:理想万岁万万岁  
这篇文章主要介绍了Java设计模式之中介模式,中介模式(Mediator Pattern),属于行为型设计模式,目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类之间的通信复杂性,需要的朋友可以参考下

一、介绍

中介模式(Mediator Pattern),属于行为型设计模式。目的是把系统中对象之间的调用关系从一对多转变成一对一的调用关系,以此来降低多个对象和类之间的通信复杂性。

在很多情况下,一个类中对象于对象之间的调用往往很容易形成网状结构,此时倘若一个对象发生改变,那么将会导致其他所有与之关联的对象进行修改,从而导致系统复杂性增加,且难以维护。

使用中介模式,可以通过向系统中引入中介类,将这种网状结构改为星型结构,各个对象直接不直接关联而是通过该中介类进行交互,当一个对象发生改变时,只需要在中介类中做出相应的修改即可,其他对象对此变化是无感的。

用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

使用下面图示可能会更好的进行表达

在这里插入图片描述

二、生活中的中介模式

在我们日常生活中,处处存在中介模式的影子。

房产中介

如果没有房产中介,我们需要亲自联系各个房东约其看房,既浪费自己的时间也浪费各个房东的时间;

有了房产中介,我们只需要联系中介小哥就行了,中介小哥有各个房东的钥匙,直接看房,十分方便。

线上招聘平台

在没有线上招聘平台的情况下,我们要找一家公司应聘是一件十分麻烦的事情,要么亲自带着简历去公司询问是否招聘某岗位(可能因为不招人而白跑一趟),要么在网上查找各个公司的官网招聘页以邮箱的形式投递简历,但甚至很多小公司都没有官网;

有了线上招聘平台后,应聘者直接在平台上联系各个公司就好了,通过该平台,应聘者不仅可以看到各种大中小公司,还不会因为公司招聘流程的改变而受影响,因为应聘者在平台上的操作都是一样的。

三、中介模式中的角色

在中介模式中,最重要的角色就是**中介角色(Mediator )**了,它用于在系统中各个对象之间建立关联关系。

抽象中介接口类(Mediator)

定义中介的功能。

具体中介类(MediatorImpl)

实现中介接口类定义的功能。在实现的功能逻辑中,给各个对象建立关联关系,因此中介类中需要维护一个包含关联的各个组件的集合并对该集合进行维护。

系统组件抽象接口类(Component)

定义系统中各个对象的功能。

系统组件具体实现类(AComponent、BComponent、CComponent)

实现各个对象的功能。

通过对中介模式中各个角色的分析,可得其通用UM图如下所示

在这里插入图片描述

四、案例演示

群发消息为例,每当我们在重大传统节日时,许多人喜欢使用短信群发的形式,将节日祝福一次性群发给他的亲朋好友们。这是一个非常好的案例,在没有群发功能的时候,我们想好一段祝福语后,需要一个接一个地对通讯录中的朋友进行发送短信(一对多);而后来有了群发功能后,我们选择群发功能,将亲朋好友都添加到这个功能中作为群发联系人,然后点击发送短信就可以将祝福发送给所有人了(一对一)。此时群发功能就相当于中介

1. 角色分析

联系人接口(Friend)

定义联系人的功能。在节日祝福中,我们通讯录中的联系人有个接收短信功能receiveMessage()就够了。

public interface Friend {

    void receiveMessage(String message);
}

具体联系人(FriendImpl)

实现联系人接口(Friend)定义的功能。假设联系人有三个:父亲、母亲、姐姐。

public class Father implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("父亲收到短信:" + message);
    }
}
public class Mother implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("母亲收到短信:" + message);
    }
}
public class Sister implements Friend{
    @Override
    public void receiveMessage(String message) {
        System.out.println("姐姐收到短信:" + message);
    }
}

抽象群发接口(SendGroup)

定义一个发送功能send(),以及对群发目标联系人的维护功能addFriend()、removeFriend()。

public interface SendGroup {
    void addFriend(Friend friend);
    void removeFriend(Friend friend);
    void send(String message);
}

具体群发中介类(SendGroupImpl)

实现抽象群发接口SendGroup定义的功能。前面分析中说过,中介类中需要维护一个包含所有联系人的集合并对其进行维护。

public class SendGroupImpl implements SendGroup{
    private final List<Friend> friendList = new ArrayList<>();
    @Override
    public void addFriend(Friend friend) {
        if (!friendList.contains(friend)) {
            friendList.add(friend);
        }
    }
    @Override
    public void removeFriend(Friend friend) {
        friendList.remove(friend);
    }
    @Override
    public void send(String message) {
        for (Friend friend : friendList) {
            friend.receiveMessage(message);
        }
    }
}

客户端(MediatorClient)

新建一个客户端类对该案例进行演示

public class MediatorClient {
    public static void main(String[] args) {
        Friend father = new Father();
        Friend mother = new Mother();
        Friend sister = new Sister();
        // 选择需要群发短信的联系人
        SendGroup sendGroup = new SendGroupImpl();
        sendGroup.addFriend(father);
        sendGroup.addFriend(mother);
        sendGroup.addFriend(sister);
        // 群发短信
        sendGroup.send("新年快乐");
    }
}

运行该代码后得到以下输出

在这里插入图片描述

五、优缺点

优点:

  • 通过引入中介类,将对象之间的关系从一对多变成了一对一
  • 将各个类进行解耦

缺点:

对客户端的代码维护,转变为对中介类的维护,中介类变得庞大时也将同样难以维护。

到此这篇关于Java设计模式之中介模式的文章就介绍到这了,更多相关Java中介模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot整合Bootstrap的超详细步骤

    Spring Boot整合Bootstrap的超详细步骤

    之前做前端开发,在使用bootstrap的时候都是去官网下载,然后放到项目中,在页面引用,下面这篇文章主要给大家介绍了关于Spring Boot整合Bootstrap的超详细步骤,需要的朋友可以参考下
    2023-05-05
  • Java的HashMap源码解析

    Java的HashMap源码解析

    这篇文章主要介绍了Java的HashMap源码解析,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对是一个Node,后台是用一个Node数组来存放数据,这个Node数组就是HashMap的主干,需要的朋友可以参考下
    2023-11-11
  • spring在service层的方法报错事务不会回滚的解决

    spring在service层的方法报错事务不会回滚的解决

    这篇文章主要介绍了spring在service层的方法报错事务不会回滚的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Spring Boot快速实现 IP地址解析的示例详解

    Spring Boot快速实现 IP地址解析的示例详解

    这篇文章主要介绍了Spring Boot快速实现IP地址解析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 一文搞懂java反射基本API

    一文搞懂java反射基本API

    这篇文章主要为大家介绍了一文搞懂java反射基本API,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • idea如何添加文档注释

    idea如何添加文档注释

    这篇文章主要介绍了idea如何添加文档注释,本文给大家介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • 浅谈Java 代理机制

    浅谈Java 代理机制

    Java 有两种代理方式,一种是静态代理,另一种是动态代理。如果我们在代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理;如果不能确定,那么可以使用类的动态加载机制,在代码运行期间加载被代理的类这就是动态代理
    2021-06-06
  • 使用Java实现解析Excel公式

    使用Java实现解析Excel公式

    在日常工作中,我们经常需要在Excel中使用公式对表中数据进行计算和分析,所以本文小编主要来和大家介绍一下如何在Java中实现解析Excel公式,感兴趣的可以了解下
    2024-02-02
  • MyBatis中多对一和一对多数据的处理方法

    MyBatis中多对一和一对多数据的处理方法

    这篇文章主要介绍了MyBatis中多对一和一对多数据的处理,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 深入理解@component与@Configuration注解

    深入理解@component与@Configuration注解

    这篇文章主要介绍了深入理解@component与@Configuration注解,从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被扫描,并用于构建bean定义,初始化Spring容器,需要的朋友可以参考下
    2023-11-11

最新评论