【Java 设计模式】行为型之中介者模式_java 设计模式 colleague mediator-程序员宅基地

技术标签: java  中介者模式  设计模式  


中介者模式(Mediator Pattern)是一种行为型设计模式,用于通过一个中介对象来集中管理多个对象之间的交互关系,从而降低对象之间的耦合度。中介者模式通过将对象之间的通信委托给中介者,使得对象之间不直接相互通信,而是通过中介者来进行交互。在本文中,我们将深入研究Java中中介者模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

中介者模式是一种行为型设计模式,用于通过一个中介对象来集中管理多个对象之间的交互关系,从而降低对象之间的耦合度。中介者模式通过将对象之间的通信委托给中介者,使得对象之间不直接相互通信,而是通过中介者来进行交互。中介者模式通常包含三个主要角色:抽象中介者(Abstract Mediator)、具体中介者(Concrete Mediator)、同事类(Colleague)。

  • 抽象中介者(Abstract Mediator): 定义了中介者的接口,负责定义同事类之间的通信方法
  • 具体中介者(Concrete Mediator): 实现了抽象中介者的接口,负责管理和协调同事类之间的交互
  • 同事类(Colleague): 每个同事类都知道中介者对象,并与中介者对象通信,但不知道其他同事类的存在

2. 应用场景

中介者模式通常在以下场景中使用:

  • 一组对象之间存在复杂的交互关系:

    当一组对象之间存在复杂的交互关系,对象之间的关系变得紧密时,可以使用中介者模式来降低对象之间的耦合度

  • 多个对象需要相互通信,但不希望直接依赖彼此:

    当多个对象需要相互通信,但不希望直接依赖彼此时,可以使用中介者模式,将对象之间的通信委托给中介者

  • 系统中对象之间的交互较为复杂,难以维护:

    当系统中对象之间的交互关系较为复杂,难以维护时,可以使用中介者模式来简化系统结构

3. 代码实现

下面通过一个简单的例子来演示中介者模式的实现。假设有一个聊天室系统,多个用户之间可以进行聊天,我们可以使用中介者模式来管理用户之间的交互。

抽象中介者 - 聊天室 ChatRoomMediator

package com.cheney.demo;

interface ChatRoomMediator {
    
    void sendMessage(UserColleague sender, String message);
}

具体中介者 - 具体聊天室 ConcreteChatRoomMediator

package com.cheney.demo;

class ConcreteChatRoomMediator implements ChatRoomMediator {
    
    @Override
    public void sendMessage(UserColleague sender, String message) {
    
        System.out.println(sender.getName() + " 发送消息: " + message);
    }
}

同事类 - 用户 UserColleague

package com.cheney.demo;

class UserColleague {
    
    private String name;
    private ChatRoomMediator mediator;

    public UserColleague(String name, ChatRoomMediator mediator) {
    
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
    
        return name;
    }

    public void sendMessage(String message) {
    
        mediator.sendMessage(this, message);
    }
}

客户端启动类 Main

package com.cheney.demo;

public class Main {
    
    public static void main(String[] args) {
    
        // 使用中介者模式实现聊天室系统
        ChatRoomMediator mediator = new ConcreteChatRoomMediator();

        UserColleague user1 = new UserColleague("用户1", mediator);
        UserColleague user2 = new UserColleague("用户2", mediator);
        UserColleague user3 = new UserColleague("用户3", mediator);

        // 用户1 发送消息: 哈喽!
        user1.sendMessage("哈喽!");
        // 用户2 发送消息:  哈喽!
        user2.sendMessage(" 哈喽!");
        // 用户3 发送消息:  哈喽!
        user3.sendMessage(" 哈喽!");
    }
}

在上述例子中,ChatRoomMediator 是抽象中介者,定义了中介者的接口。ConcreteChatRoomMediator 是具体中介者,实现了抽象中介者的接口,负责管理和协调用户之间的交互。UserColleague 是同事类,每个用户都知道中介者对象,并通过中介者对象进行通信。

在客户端中,我们使用中介者模式实现了聊天室系统。通过将用户之间的通信委托给中介者,实现了用户之间的解耦,使得系统更加灵活和可扩展。

结语

中介者模式是一种用于通过一个中介对象来集中管理多个对象之间的交互关系的设计模式。通过使用中介者模式,可以降低对象之间的耦合度,使得系统更加灵活和可扩展。在实际开发中,中介者模式常被用于实现复杂的系统中对象之间的交互关系,例如聊天室、飞机控制系统等。通过合理使用中介者模式,可以提高系统的可维护性和可扩展性。


【Java 设计模式】系列 《23 种设计模式》 与 《7 大设计原则》 总纲
设计原则
单一职责原则(SRP) 规定一个类应该只有一个引起变化的原因
开放/封闭原则(OCP) 表明软件实体应该是可以扩展的,但是不可修改的
里氏替换原则(LSP) 强调派生类必须能够替代其基类而不引起程序错误
依赖倒置原则(DIP) 倡导高层模块不应该依赖于低层模块,二者都应该依赖于抽象
接口隔离原则(ISP) 提倡一个类不应该被强迫依赖它不使用的接口
合成/聚合复用原则(CARP) 建议尽量使用合成/聚合,尽量不要使用继承
迪米特法则(LoD) 规定一个对象应该对其他对象有最少的了解

创建型设计模式
单例模式 保证一个类仅有一个实例,并提供一个访问它的全局点
工厂方法模式 定义一个用于创建对象的接口,但是由子类决定实例化哪一个类
抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
建造者模式 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
原型模式 通过复制现有的对象来创建新对象,而不是从头开始创建

结构型设计模式
适配器模式 将一个类的接口转换成客户希望的另外一个接口
桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化
组合模式 将对象以树形结构组合以表示“部分-整体”的层次结构
装饰器模式 动态地给一个对象添加一些额外的职责
外观模式 为子系统中的一组接口提供一个一致的界面
代理模式 为其他对象提供一种代理以控制对这个对象的访问
享元模式 用共享的方式高效地支持大量小粒度对象

行为型设计模式
观察者模式 定义对象间的一对多依赖,当一个对象改变状态,所有依赖者都会受到通知并自动更新
策略模式 定义一系列算法,将它们封装起来,并且使它们可以相互替换
命令模式 将请求封装成对象,使得可以用不同的请求对客户进行参数化
状态模式 允许对象在其内部状态改变时改变它的行为
责任链模式 为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求
访问者模式 将算法与对象结构分离,并且可以在不改变对象结构的前提下定义新的操作
中介者模式 用一个中介对象来封装一系列的对象交互
备忘录模式 在不破坏封装的情况下,捕获对象的内部状态,并在对象之外保存这个状态
迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部表示
模版方法模式 定义一个操作中的算法的骨架,将一些步骤延迟到子类中
解释器模式 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yanyc0411/article/details/135779184

智能推荐

[UE4]C++ 动态内存分配(6种情况,好几个例子)-程序员宅基地

文章浏览阅读92次。1.堆内存分配 :C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。堆的概念:通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配; 有些操作对象只在程序..._ue4c++内存问题

Unity替换启动Logo动画_unity 启动动画-程序员宅基地

文章浏览阅读1.4w次,点赞215次,收藏271次。最近的项目中,由于Android中集成了Unity场景,每次进入打包好的Unity项目时都会出现Unity的标志性动画,让用户处于等待状态,体验感比较差;于是便在产品经理的要求下将Unity的启动Logo换成公司的宣传动画今天给大家分享一下第二种解决方案,我是将Unity与Android的交互先写好,然后再把Unity打包成Android项目嵌入到主Android项目中。_unity 启动动画

Clover 去除广告_clover无广告-程序员宅基地

文章浏览阅读1.9w次,点赞14次,收藏8次。Clover 是一款类似浏览器的文件资源管理器。它可以在同一款窗口内打开多个文件资源管理器界面,在进程文件操作的时候非常方便,而且还支持收藏功能。下面是一张使用截图: 当然,实现上我猜测它是把windows原始的资源管理器的窗口进行统一管理,因为可以发现大部分的菜单都是windows原始的资源管理器的。----------------..._clover无广告

itext7 +thymeleaf实现html转pdf, 模板动态填值,解决linux环境兼容问题_itext html转pdf-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏10次。springboot项目实现html转pdf功能,踩过一些坑,记录遇到的问题。 附java代码,html代码,字体库下载地址,可直接运行main方法,生成pdf。_itext html转pdf

VS Code Server的离线安装过程_vscode server 离线安装-程序员宅基地

文章浏览阅读2.7k次。因为经常要开发Linux平台程序,而工作环境只有Windows桌面端与Linux服务器,并且都是运行在内网环境下,无法直接访问外网。想要在这种环境下找到一个趁手的开发工具,能够运行在Windows系统下,又拥有Linux开发环境(至少能够自动跳转、自动补全),所以我选择了使用VS Code + Remote SSH插件的方案,而问题在于如何在离线的情况下在Linux服务器上部署VS Code Server。需要以下几个环节:1)安装ssh工具2)SSH-Remote插件3)服务器安装vs.._vscode server 离线安装

更新 | ONES Performance 研发效能管理-程序员宅基地

文章浏览阅读657次。在软件研发过程中,「研发效能」体现了团队快速持续交付产品的能力。科学合理的「研发效能管理」不仅能度量团队效能,助力研发过程改进,还能帮助团队统一目标,激发团队潜能。然而,企业在实践研发效..._研发效能痛点

随便推点

不能装载通讯模块。驱动程序安装不正确。_通讯模块无效。驱动程序安装不正确-程序员宅基地

文章浏览阅读1.5w次。 周末全盘杀毒。删除系统垃圾文件。 使用了unlocker、完美卸载、360安全卫士,终于搞掉了可恶的SoundMix.dll、SoudMax.dll。 今早用D7编译程序,发现IDE报ADO的错“不能装载通讯模块。驱动程序安装不正确”。 在MS SQL Server“企业管理器”中,连接本地数据库,没有问题。 但作为客户端连接网络内其他数据数据库,均报错:“不能_通讯模块无效。驱动程序安装不正确

在Ubuntu上下载、编译和安装Android最新源代码_archive file can't be opened with any of the regis-程序员宅基地

文章浏览阅读8.6k次。此文大部分来至于转载,其中部分在本人实验下做了修改。官网内容:Initializing a Build EnvironmentThe "Getting Started" section describes how to set up your local work environment, how to use Repo to get t_archive file can't be opened with any of the registered codecs

ozan (oz) yigit grep 源码分析2_grep源码分析-程序员宅基地

文章浏览阅读224次。ozan (oz) yigit grep 源码分析2昨天在床上也在回想oz的代码,因为涉及到pmatch回退的过程,感觉没有彻底理解,于是在心里模拟代码的运行。终于有点想明白了。 while (lp >= are) { if (e = pmatch(lp, ap)) return e; ..._grep源码分析

2021秋招面试经历----硬件工程师_硬件工程师自我介绍-程序员宅基地

文章浏览阅读7.3k次,点赞11次,收藏172次。先介绍一下楼主情况,2021届毕业生,本硕都是车辆相关,硕士阶段主要在做电子类工作,所以投的大都是非车企的硬件工程师岗位。从2020年3月开始找实习,到2020年10月签约,前后投递了差不多六七十份简历,不过得到的笔试和面试机会远远没有这么多,不知道是不是由于跨专业的原因。现在还记得投的实习简历大都石沉大海,没有任何回复,所以那两三个月极度焦虑,所幸最后得到了CVTE的实习机会(表白一下CVTE,给了很棒的实习体验)。之前找工作时在网上看到的面经大都是软件相关的,与硬件相关的并不是很多,所以特意_硬件工程师自我介绍

区块链起点——避免你再错过几个亿_起点下载区块链-程序员宅基地

文章浏览阅读1.5k次。区块链起点——避免你再错过几个亿如果对新鲜事物不够敏感,可以懊悔错过早期的机会。但是当新领域已经站在风口,请不要再视而不见。希望你的区块链知识从这里开始2013年的时候,身边的朋友就在谈论比特币,挖矿。在当时的我看来,这是个太虚的东西,没有任何实际的价值。时间进入到2017年,单个比特币价值近2万美刀的时候,我依然觉得是庞氏骗局,大家玩着击鼓传花的游戏。到2018年,自己开始从事相关工..._起点下载区块链

activiti7 会签并行多实例任务实现,一票否决,会签后添加网关判断_activiti7 一个流程同时给多个人审核-程序员宅基地

文章浏览阅读8.9k次,点赞10次,收藏38次。1、功能需求会签实现多个人同时审批,任意一个人不同意时,会签任务结束,不同意走八戒审批,同意走悟空审批,最后流程结束。流程图如下:绘制流程图:动态设置审批人,完成条件${(pass == 'no')||(nrOfCompletedInstances/nrOfInstances==1)}添加表单字段控件FormProperty_29f662k-_!string-_!审批意见-_!请输入-_!s,需和前端约定,控件解析格式添加执行监听器,任务结束时调用。网关..._activiti7 一个流程同时给多个人审核

推荐文章

热门文章

相关标签