Java 设计模式——中介者模式

目录

  • 1.概述
  • 2.结构
  • 3.案例实现
    • 3.1.抽象中介类
    • 3.2.抽象同事类
    • 3.3.具体同事类
    • 3.4.具体中介类
    • 3.5.测试
  • 4.优缺点
  • 5.使用场景

1.概述

(1)一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有 6 个同事类对象,假如对象 1 发生变化,那么将会有 4 个对象受到影响。如果对象 2 发生变化,那么将会有 5 个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。

(2)如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为

在这里插入图片描述

(3)中介者模式 (Mediator Pattern) 是一种行为型设计模式,它允许对象通过一个中介对象来进行协作,而不是直接相互引用,从而降低对象之间的耦合度,同时提高代码的可维护性和可扩展性

2.结构

中介者模式包含以下主要角色:

  • 抽象中介者 (Mediator) 角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者 (Concrete Mediator) 角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  • 抽象同事类 (Colleague) 角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类 (Concrete Colleague) 角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

3.案例实现

【例】租房:现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。其类图下:
在这里插入图片描述
具体实现代码如下:

3.1.抽象中介类

Mediator.java

//抽象中介者类
public abstract class Mediator {public abstract void constact(String message, Person person);
}

3.2.抽象同事类

Person.java

//抽象同事类
public abstract class Person {protected String name;protected Mediator mediator;public Person(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}
}

3.3.具体同事类

//租房者
public class Tenant extends Person{public Tenant(String name, Mediator mediator) {super(name, mediator);}//和中介沟通的方法public void constact(String message){mediator.constact(message, this);}//获取信息public void getMessage(String message){System.out.println("租房者" + name + "获取到的信息是:" + message);}
}

HouseOwner.java

//房主类
public class HouseOwner extends Person{public HouseOwner(String name, Mediator mediator) {super(name, mediator);}//和中介沟通的方法public void constact(String message){mediator.constact(message,this);}//获取信息public void getMessage(String message){System.out.println("房主" + name + "获取到的信息是:" + message);}
}

3.4.具体中介类

MediatorStructure.java

//具体的中介者角色类
public class MediatorStructure extends Mediator {//聚合房主和具体的租房者对象private HouseOwner houseOwner;private Tenant tenant;public HouseOwner getHouseOwner() {return houseOwner;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner = houseOwner;}public Tenant getTenant() {return tenant;}public void setTenant(Tenant tenant) {this.tenant = tenant;}@Overridepublic void constact(String message, Person person) {if (person == houseOwner) {tenant.getMessage(message);} else {houseOwner.getMessage(message);}}
}

3.5.测试

Client.java

public class Client {public static void main(String[] args) {//创建中介者对象MediatorStructure mediator = new MediatorStructure();//创建租房者对象Tenant tenant = new Tenant("李四", mediator);//创建房主对象HouseOwner houseOwner = new HouseOwner("张三", mediator);//中介者要知道具体的房主和租房者mediator.setTenant(tenant);mediator.setHouseOwner(houseOwner);tenant.constact("我要租三室的房子!");houseOwner.constact("我这里有三室的房子,你要租吗?");}
}

输出结果如下:

房主张三获取到的信息是:我要租三室的房子!
租房者李四获取到的信息是:我这里有三室的房子,你要租吗?

4.优缺点

(1)中介者模式的优点包括:

  • 减少对象之间的直接耦合:通过引入中介者对象,各个对象不再直接相互引用,而是通过中介者来协调和管理交互,从而降低了对象之间的依赖程度。
  • 简化对象的交互逻辑:中介者模式将对象之间的交互行为集中在中介者对象中实现,各个对象只需要与中介者进行通信,不需要了解其他对象的具体细节,从而简化了对象之间的交互逻辑。
  • 提高系统的可维护性和可扩展性:通过降低对象之间的耦合度,中介者模式使系统更加灵活和易于维护。当系统需要新增一些交互行为时,只需要修改中介者对象即可,无需修改各个同事对象。
  • 促进代码重用:中介者模式可以将对象之间公共的交互行为抽象到中介者对象中,从而可以更好地复用代码。

(2)中介者模式的缺点包括:

  • 中介者对象可能会变得复杂:随着系统中的对象和交互行为增多,中介者对象可能会承担过多的责任,变得复杂和庞大。
  • 中介者模式可能导致性能问题:因为所有的交互行为都通过中介者进行,所以中介者可能成为系统的瓶颈,导致性能问题。
  • 增加了系统的复杂性:中介者模式增加了一个新的抽象层次,引入了中介者对象,使系统的架构更加复杂,对于简单的交互行为并不适用。

(3)所以在使用中介者模式时,需要权衡其优势和缺点,并根据具体情况进行选择。它适用于对象之间的交互关系复杂、需要集中管理和协调的场景,但对于简单的交互行为,可能会过于繁琐和不必要。

5.使用场景

(1)中介者模式适用于以下场景:

  • 对象之间的交互关系复杂:当系统中的对象之间存在复杂的交互关系,很难直接进行管理和协调时,可以引入中介者模式来简化和集中管理对象之间的交互行为。
  • 需要减少对象之间的耦合度:当对象之间的直接引用和依赖关系较多,难以维护和扩展时,可以使用中介者模式来解耦对象之间的关系,通过统一的中介者来进行交互。
  • 多个对象共享一些公共行为或信息:当多个对象需要共享某些公共行为或信息,并且希望集中管理和协调这些行为或信息时,可以使用中介者模式。
  • 多个对象之间的交互频繁:当多个对象之间频繁进行交互,且存在复杂的交互逻辑时,可以使用中介者模式来简化交互过程,提高代码的可维护性和可扩展性。

(2)一些常见的应用中介者模式的场景包括:

  • 图形界面中的 MVC 模式:在 MVC 模式中,中介者模式用于协调视图、模型和控制器之间的交互。
  • 多人在线游戏系统:在多人在线游戏中,中介者模式可以用于处理玩家之间的交互、通信和协作。
  • 航空管制系统:在航空管制系统中,中介者模式可以用于协调不同飞机之间的通信、路径规划和冲突解决。
  • UI 组件库:在构建 UI 组件库或框架时,中介者模式可以用于统一管理组件之间的交互行为,从而提供统一的接口和规范。

(3)总之,中介者模式适用于需要集中管理和协调对象之间交互关系的复杂场景,以提高系统的灵活性、可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境,安装教程教程随便找一个就好。 第一步:安装好之后创建conda虚拟环境: conda create -n your_env_name pythonx.x 第二步:安装需要版本的pytorch:pytorch下载链接 cu100/torch-1.2…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用,你需要按照以下步骤操作: 步骤 1:安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后,npm&…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

Java Web——TomcatWeb服务器

目录 1. 服务器概述 1.1. 服务器硬件 1.2. 服务器软件 2. Web服务器 2.1. Tomcat服务器 2.2. 简单的Web服务器使用 1. 服务器概述 服务器指的是网络环境下为客户机提供某种服务的专用计算机,服务器安装有网络操作系统和各种服务器的应用系统服务器的具有高速…

《向量数据库指南》——2023云栖大会现场,向量数据库Milvus Cloud成关注焦点

近期,广受关注的2023 云栖大会正式收官,来自全球各地的开发者集聚一堂,共同探索 AI 时代的更多可能性。 云栖大会是由阿里巴巴集团主办的科技盛宴,是中国最早的开发者创新展示平台。据悉,今年云栖大会的主题为“计算,为了无法计算的价值”,共吸引了全球 44 个国家和地区…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作:拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件,要setDragEnabled(true) 对于要拖入的窗口或控件,要setAcceptDrops(true) 下面以一个具体的用例进行说…

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中,数据以图的形式表示,其中节点表示实体,边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据,如社交网络、推荐系统、网络…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去,特意用了浅色字体 选择题 2-1 下述程序段的时间复杂度为( ) for&#xff0…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明:Edge自动更新版本后(版本 119.0.2151.58),出现了侧边栏,看着很不舒服,效果如上图 修改: 1、在设置找到侧栏 2、点击Copilot后,展示的页面中会有始终显示边栏这一开…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接:P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干: 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息,问每个点被多少个地毯覆盖。 输入格式 第一行,两个…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中,保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障,更是一项战略,涉及组织的整体准备、规划和应对能力,以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…

Docker - 企业项目

Docker - 企业项目 因为环境原因,本章本人没有实际操作,以理论为主 容器单独没有什么意义,有意义的是容器的编排 Docker 4台:1核2G的ECS K8s 9台:2核4G的ECS Docker Compose Docker Swarm # manager节点初始化sw…

【C++11】线程库

文章目录 thread 线程库mutex 锁atomic 原子性操作condition_variable 条件变量实现两个线程交替打印1-100 thread 线程库 在C11之前,涉及到多线程问题,都是和平台相关的,比如Windows和Linux下各有自己的接口,这使得代码的可移植…

(Matalb时序预测)GWO-BP灰狼算法优化BP神经网络的多维时序回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、部分代码展示: 四、完整代码数据说明手册下载: 一、程序及算法内容介绍: 基本内容: 本代码基于M…

01:2440----点灯大师

目录 一:点亮一个LED 1:原理图 2:寄存器 3:2440的框架和启动过程 A:框架 B:启动过程 4:代码 5:ARM知识补充 6:c语言和汇编的应用 A:代码 B:分析汇编语言 C:内存空间 7:内部机制 二:点亮2个灯 三:流水灯 四:按键控制LED 1:原理图 2:寄存器配置 3:代码 一:点…

DNS服务器典型配置

文章目录 安装主程序bind和安全插件bind-root修改主配置文件/etc/named.conf正向解析 安装主程序bind和安全插件bind-root yum install bind-chroot修改主配置文件/etc/named.conf vim /etc/named.conf将listen-on和allow-query的ip或域名换成any 表示为服务器所有的IP地址启…

利用Nextcloud搭建企业私有云盘系统

利用Nextcloud搭建企业私有云盘系统 1. 场景介绍2. 环境准备3. 安装NextCloud4. 系统功能验证 1. 场景介绍 Nextcloud是一款免费开源的私有云存储系统,采用PHPMySQL开发,提供了多个同步客户端支持多种设备访问,使用Nextcloud可以快速便捷地搭…