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.pswp.cn/news/35585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35585.shtml
英文地址,請注明出處:http://en.pswp.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針對自研倚天芯片,從芯片到數據庫內核全鏈路優化,助力企業降本增效。基于阿里云自研的倚天服務器,同時在數據庫…