Go和Java实现中介者模式

Go和Java实现中介者模式

下面通过一个同事之间相互通信的例子来说明中介者模式的使用。

1、中介者模式

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的

通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

  • 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松

    散,而且可以独立地改变它们之间的交互。

  • 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发

    生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

  • 何时使用:多个类相互耦合,形成了网状结构。

  • 如何解决:将上述网状结构分离为星型结构。

  • 关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。

  • 应用实例:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

    2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

  • 优点:1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

  • 缺点:中介者会庞大,变得复杂难以维护。

  • 使用场景:1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该

    对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

  • 注意事项:不应当在职责混乱的时候使用。

  • 适用性:

    一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。

    一个对象引用其他很多对象并且直接与这些对象通信,导致难以复现该对象。

    想定制一个分布在多个类中的行为,而又不想生成太多的子类。

2、Go实现中介者模式

package mediator// ========== Colleague同事类 ==========
type Colleague interface {Send(string)Notify(string)
}
package mediatorimport "fmt"// ========== ColleagueA同事类A ==========
type ColleagueA struct {Mediator
}func (colleagueA *ColleagueA) Send(message string) {colleagueA.Mediator.Send(message, colleagueA)
}func (colleagueA *ColleagueA) Notify(message string) {fmt.Println("同事A得到信息:" + message)
}
package mediatorimport "fmt"// ========== ColleagueB同事类B ==========
type ColleagueB struct {Mediator
}func (colleagueB *ColleagueB) Send(message string) {colleagueB.Mediator.Send(message, colleagueB)}func (colleagueB *ColleagueB) Notify(message string) {fmt.Println("同事B得到信息:" + message)}
package mediator// ========== Mediator中介者类 ==========
type Mediator interface {Send(string, Colleague)
}
package com.mediator;// ========== ConcreteMediator ==========
public class ConcreteMediator extends Mediator{private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleagueA){colleagueB.notify(message);}else{colleagueA.notify(message);}}
}
package mainimport . "proj/mediator"func main() {concreteMediator := ConcreteMediator{}colleagueA := ColleagueA{Mediator: &concreteMediator}colleagueB := ColleagueB{Mediator: &concreteMediator}concreteMediator.SetColleagueA(colleagueA)concreteMediator.SetColleagueB(colleagueB)colleagueA.Send("吃过饭了没?")colleagueB.Send("没有呢,你打算请客吗?")
}
# 程序输出
同事A得到信息:吃过饭了没?
同事A得到信息:没有呢,你打算请客吗?

3、Java实现中介者模式

package com.mediator;// ========== Colleague同事类 ==========
public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator){this.mediator = mediator;}public void send(String message){this.mediator.send(message,this);}public abstract void notify(String message);
}
package com.mediator;// ========== ColleagueA同事类A ==========
public class ColleagueA extends Colleague{public ColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void notify(String message){System.out.println("同事A得到信息:"+message);}
}
package com.mediator;// ========== ColleagueB同事类B ==========
public class ColleagueB extends Colleague{public ColleagueB(Mediator mediator) {super(mediator);}@Overridepublic void notify(String message){System.out.println("同事B得到信息:"+message);}
}
package com.mediator;// ========== Mediator中介者类 ==========
public abstract  class Mediator {public abstract void send(String message,Colleague colleague);
}
package com.mediator;// ========== ConcreteMediator ==========
public class ConcreteMediator extends Mediator{private ColleagueA colleagueA;private ColleagueB colleagueB;public void setColleagueA(ColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == colleagueA){colleagueB.notify(message);}else{colleagueA.notify(message);}}
}
package com.mediator;public class Test {public static void main(String[] args) {ConcreteMediator concreteMediator = new ConcreteMediator();ColleagueA colleagueA = new ColleagueA(concreteMediator);ColleagueB colleagueB = new ColleagueB(concreteMediator);concreteMediator.setColleagueA(colleagueA);concreteMediator.setColleagueB(colleagueB);colleagueA.send("吃过饭了没?");colleagueB.send("没有呢,你打算请客吗?");}
}
# 程序输出
同事B得到信息:吃过饭了没?
同事A得到信息:没有呢,你打算请客吗?

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

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

相关文章

1.作用域

1.1局部作用域 局部作用域分为函数作用域和块作用域。 1.函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结: (1)函数内部声明的变量,在函数外部无法被访问 (2)函数的参数也是函数内部的局部变量 (3)不同函数…

Redis——三个特殊的数据类型+事务

概述 全称为远程字典服务。 Redis——基础篇(包含redis在云服务上的docker化安装和连接以及常用命令)_连接docker中的redis_北岭山脚鼠鼠的博客-CSDN博客 Redis能干什么? 1.内存存储、持久化,内存中是断电即失,因此持久化很重要&#xff…

【LVS-NAT配置】

配置 node1:128(客户端) node2:135(调度器) RS: node3:130 node4:132 node2添加网络适配器(仅主机模式) [rootnode2 ~]# nmtui[rootnode2 ~]#…

ETLCloud+MaxCompute实现云数据仓库的高效实时同步

MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS(Software as a Service)模式云数据仓库,以Serverless架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用…

欧拉公式之证明

首先,我们考虑复数函数的泰勒级数展开式。对于任意一个复数函数f(z),我们可以将其在za处进行泰勒级数展开: f(z) f(a) f(a)(z-a) f(a)(z-a)^2/2! f(a)(z-a)^3/3! ... 其中f(a)表示f(z)在za处的导数,f(a)表示f(z)在…

从零开始学Python(三)函数与lambda表达式

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Python的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.函数 1.函数与方法的区别 2.函数的定…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场…

深入解析 SOCKS5 代理及其在网络安全与爬虫中的应用

在当今数字化时代,网络安全和数据获取成为了互联网时代的重要课题。为了实现安全的网络连接和高效的数据采集,各种代理技术应运而生。本文将深入探讨 SOCKS5 代理及其在网络安全和爬虫领域的应用,同时比较其与其他代理方式的优势与劣势。 1.…

TypeScript 语法

环境搭建 以javascript为基础构建的语言,一个js的超集,可以在任何支持js的平台中执行,ts扩展了js并且添加了类型,但是ts不能被js解析器直接执行,需要编译器编译为js文件,然后引入到 html 页面使用。 ts增…

04 mysql innodb record

前言 最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 这里会参照 MySQL Internals Manual 来大致的看一下 i…

通过matlab对比music,mvdr以及tdoa三种定位算法的性能

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MUSIC(Multiple Signal Classification) 4.2 MVDR(Minimum Variance Distortionless Response) 4.3 TDOA(Time Difference o…

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)

目录 往期文章传送门 一、硬件定时器 硬件实现 软件实现 二、上板测试 往期文章传送门 开发一个RISC-V上的操作系统(一)—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统(二)—— 系统引导…

AD域机器KMS自动激活

1、打开AD域控,点击DNS管理 2、创建其它记录 3、选择服务位置 SRV 4、输入相关信息 服务:_VLMCS协议:_TCP权重:100端口号:1688KMS服务器地址:10.3.0.211 5、成功,这时域内主机重启后&#xff0…

腾讯云CVM服务器2核2g1m带宽支持多少人访问?

腾讯云2核2g1m的服务器支持多少人同时访问?2核2g1m云服务器短板是在1M公网带宽上,腾讯云服务器网以网站应用为例,当大规模用户同时访问网站时,很大概率会卡在公网带宽上,所以压根就谈不上2核2G的CPU内存计算性能是否够…

sql 执行的顺序

在执行 SQL 查询时,通常会按照以下顺序进行处理: FROM 子句:指定要查询的表或视图。WHERE 子句:筛选满足特定条件的行。GROUP BY 子句:将结果按照指定的列进行分组。HAVING 子句:筛选满足特定条件的分组。…

烧写PYNQ镜像到SD卡

一,安装 Win32diskimager 首先将Micro SD卡插入读卡器的卡槽中,然后再将读卡器插入计算机USB接口,此时计算机将会识别到插入的可移动磁盘。双击打开Win32DiskImager-1.0.0.zip 压缩文件,里面win32diskimager-1.0.0-install.exe文…

Postman

Postman 简介下载安装 简介 Postman 是一款用于测试和开发 API(应用程序编程接口)的工具,它提供了用户友好的界面和丰富的功能,帮助开发者轻松地创建、测试、调试和文档化各种类型的 API。无论是在构建 Web 应用、移动应用还是其…

“深入解析Maven:安装、创建项目和依赖管理的完全指南“

目录 引言Maven的安装创建Maven项目之前的装备工作Eclipse创建新的Maven项目项目依赖管理 总结 引言 Maven是一个流行的项目管理工具,被广泛用于Java项目的构建、依赖管理和部署。它提供了一种简单而强大的方式来管理项目的各个方面,使开发人员能够更专…

LeetCode 1631. Path With Minimum Effort【最小瓶颈路;二分+BFS或DFS;计数排序+并查集;最小生成树】1947

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

阿里云PolarDB数据库倚天ARM架构详细介绍

阿里云云原生数据库PolarDB MySQL版推出倚天ARM架构,倚天ARM架构规格相比X86架构规格最高降价45%,PolarDB针对自研倚天芯片,从芯片到数据库内核全链路优化,助力企业降本增效。基于阿里云自研的倚天服务器,同时在数据库…