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

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

    • 中介者模式
      • 定义
      • 结构
      • 案例实现
      • 优缺点
      • 使用场景

中介者模式

定义

又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互。

结构

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

案例实现

租房:房主将房屋托管给中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。
类图如下:
在这里插入图片描述

/*** 抽象中介者类*/
public abstract class Mediator {public abstract void constact(String message,Person person);
}
/*** 具体的中介者*/
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);}}
}
/*** 抽象同事类*/
public abstract class Person {protected String name;protected Mediator mediator;public Person(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}
}
/*** 具体同事类*/
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);}
}
/*** 房主类*/
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);}
}
public class Test01 {public static void main(String[] args) {// 创建中介者对象MediatorStructure mediatorStructure = new MediatorStructure();// 创建租房者对象Tenant tenant = new Tenant("张三", mediatorStructure);// 创建房主对象HouseOwner houseOwner = new HouseOwner("李四", mediatorStructure);// 中介要知道具体的房主和租客mediatorStructure.setTenant(tenant);mediatorStructure.setHouseOwner(houseOwner);// 租客和房主都是通过中介来获取的信息、并进行沟通tenant.constact("我想租一个两室一厅");houseOwner.constact("2500一个月,年租2万5");}
}

在这里插入图片描述

优缺点

  • 优点:
    • 松散耦合,中介者通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样同事对象就可以独立的变化和复用。
    • 集中控制交互,多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要修改。
    • 一对多关联转变为一对一关联,没有使用中介者模式时,同事对象之间的关系通常是一对多的,引入中介者对象之后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。
  • 缺点:
    • 当同事类太多时,中介者的职责将很大,它会变得复杂庞大以至于难以维护

使用场景

  • 当系统中对象之间复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

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

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

相关文章

Java基础回顾——数据类型

文章目录 基本数据类型引用类型数组类型遍历数组排序多维数组 常量var关键字四则运算移位操作位运算类型自动提升和强制转型浮点数运算三元运算符 内容摘自https://www.liaoxuefeng.com/wiki/1252599548343744/1255883729079552 基本数据类型 整数类型:byte&#…

网络协议 - DNS 相关详解

网络协议 - DNS 相关详解 DNS简介域名层级结构域名服务器 DNS 解析流程为什么DNS通常基于UDP DNS 查询dig 查询host查询nslookup查询whois查询在线工具查询 DNS 调度原理地理位置调度不准确规则变更生效时间不确定高可用 DNS 安全相关什么是DNS劫持什么是DNS污染为什么要DNS流量…

代付系统源码/第三方API代付系统源码/手工代付系统/批量代付系统/集成QQ微信支付宝API代付系统

源码介绍: 这是一款代付系统源码、API代付系统源码,也是手工代付系统、批量代付系统和第三方API代付系统,它是QQ微信支付宝API代付系统,余额充值接口集成易支付。 系统以0S秒下发,支持支付宝、微信、QQ等主流支付通道…

QT笔记(节选)具体图片等下载资源

QT笔记(节选)具体图片等下载资源 根据b站视频做的笔记: https://www.bilibili.com/video/BV1g4411H78N?p44&spm_id_frompageDriver&vd_sourcea3e6a48ccd3d7d1f969f662653ed68c9 qt是一个跨平台的c图形用户界面应用程序框架&#x…

从最近爆火的ChatGPT,我看到了电商的下一个形态

爆火的ChatGPT似乎让每个行业有了改造的可能性,电商行业也不例外。 在讨论了很多流量红利消失的话题后,我们看到互联网电商行业不再性感,从淘宝天猫,京东,到拼多多,再到抖音,快手,电…

MacOS下载配置OpenCV

主要参考的是OpenCV官方的这篇文章:OpenCV: Installation in MacOS 安装OpenCV需要下载一些安装包:CMake3.9、Git、Python这些我之前已经下载好,这里就不过多阐述了,自行百度安装即可 1.从Git库获取OpenCV: git clon…

C++1114新标准——模板模板参数(Template Template Parameter)、using

系列文章目录 C11&14新标准——Variadic templates(数量不定的模板参数) C11&14新标准——Uniform Initialization(统一初始化)、Initializer_list(初始化列表)、explicit C11&14新标准—— d…

SpringBoot中日志的使用log4j2

SpringBoot中日志的使用log4j2 1、log4j2介绍 Apache Log4j2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改 进,同时修复了 Logback 架构中的一些问题,主要有: 异常处理…

SpringBoot+线程池实现高频调用http接口并多线程解析json数据

场景 SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文): SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)-CSDN博客 Java中ExecutorService线程池的使用(Runnable和Callable多…

如何了解蜘蛛池蚂蚁SEO

蜘蛛池是一种基于搜索引擎优化的技术手段,通过模拟蜘蛛爬行行为来提高网站在搜索引擎中的排名,从而增加网站的流量和曝光率。 编辑搜图 如何联系蚂蚁seo? baidu搜索:如何联系蚂蚁SEO? baidu搜索:如何联…

vivado约束方法6

生成的时钟 定时约束向导建议在的输出上创建一个生成的时钟顺序单元,当它直接或通过驱动其他顺序单元的时钟引脚时一些互连逻辑。与PLL或MMCM不同,用户逻辑不能将主时钟,因此向导仅提供指定除法系数的选项,如中所示如下图所示&am…

CSS中神奇的filter属性

CSS是Web开发中不可或缺的一部分,它可以帮助开发者在页面上添加各种各样的样式和效果。其中一个比较神奇的CSS属性就是filter,它可以让我们实现各种有趣的图形处理效果。 一、filter属性的基础 filter属性是CSS中用于对元素进行图形效果处理的属性之一…