行為模式---中介者模式

概念

中介者模式是一種行為模式, 他的核心思想是通過引入一個中介者對象,將多個對象之間的復雜交互邏輯統一管理。每個對象只需要與中介者通信,而不需要直接與其他對象交互,從而降低系統的耦合度。

適用場景

  1. 對象之間交互復雜:當對象之間的交互邏輯復雜且難以維護時。
  2. 減少依賴:當需要減少對象之間的直接依賴時。
  3. 集中管理交互:當需要集中管理對象之間的交互邏輯時。

創建方式

1、創建一個中介者對象接口,在中介者對象接口中創建一個通知消息函數接口。創建其他的和構件交互的接口也可以。

2、創建同事對象的接口,在此對象中定義一個中介者引用對象。

3、實現具體的中介者對象,在具體的中介者對象中添加一個管理同事對象的數據結構。

? 1)實現設置函數將同事對象設置給中介者對象(這里可以在構造函數中進行初始化對象設置 ,也可以使用單獨的設置函數進行設置)。

? 2)實現接口中的通知函數,并實現消息的推送。

? 這里也可以直接在中介者類中創建和銷毀組件對象。

4、實現具體的基礎構件類,具體的基礎構件類中需要實現發送消息通知的函數,并且需要將自己本身添加到中介對象。

5、在客戶端創建需要中介者管理的基礎構件,在創建一個具體的中介者對象并將需要中介者管理的基礎構件以值傳遞的方式設置到中介者對象中。之后在操作基礎構件的時候時候可以通過基礎構建中設置的中介者來通知其他的基礎構件。

類關系

在這里插入圖片描述

示例代碼

#include "ZhongJieZheMoShi.h"
int main()
{std::cout << "歡迎東哥來到設計模式的世界!\n";IntermediaryBase* intermediary = new ConcretizeIntermediary();BaseComponent* component1 = new ConcretizeCompent("一:你好,我是第一個好友");component1->setIntermediary(intermediary);BaseComponent* component2 = new ConcretizeCompent("二:你好,我是第二個好友");component2->setIntermediary(intermediary);BaseComponent* component3 = new ConcretizeCompent("三:你好,我是第三個好友");component3->setIntermediary(intermediary);BaseComponent* component4 = new ConcretizeCompent("四:你好,我是第四個好友");component4->setIntermediary(intermediary);BaseComponent* component5 = new ConcretizeCompent("五:大家好");component5->setIntermediary(intermediary);component5->notify();
}
#pragma once
#include <vector>
#include <string>
#include <iostream>
using namespace std;//同事對象
class IntermediaryBase;
class BaseComponent {
public:BaseComponent() {}~BaseComponent() {}virtual void notify() = 0;virtual void diaplay() = 0;virtual void setIntermediary(IntermediaryBase* intermediary) = 0;
};//中介者接口
class IntermediaryBase
{
public:IntermediaryBase() {}~IntermediaryBase() {}virtual void notify() {}virtual void addComponent(BaseComponent* component) {}
};//具體中介者
class ConcretizeIntermediary : public IntermediaryBase {
public:ConcretizeIntermediary() {}~ConcretizeIntermediary() {}void notify() {for (int i = 0; i < m_Component.size(); ++i) {m_Component[i]->diaplay();}}void addComponent(BaseComponent* component) {m_Component.push_back(component);}vector<BaseComponent*> m_Component;
};//具體同事對象
class ConcretizeCompent : public BaseComponent {
public:ConcretizeCompent(string date) { m_date = date; }~ConcretizeCompent() {}void notify() {cout << "五:你好,我是第五個好友" << endl;m_intermediary->notify();}void diaplay() {cout << m_date << endl;}void setIntermediary(IntermediaryBase* intermediary) {m_intermediary = intermediary;intermediary->addComponent(this);}
private:IntermediaryBase* m_intermediary;string m_date;
};
歡迎東哥來到設計模式的世界!
五:你好,我是第五個好友
一:你好,我是第一個好友
二:你好,我是第二個好友
三:你好,我是第三個好友
四:你好,我是第四個好友
五:大家好

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72744.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72744.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72744.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百度移動生態事業群聚焦UGC戰略,貼吧迎新調整

易采游戲網3月8日獨家消息&#xff1a;近日據內部消息人士透露&#xff0c;百度移動生態事業群正積極將用戶生成內容&#xff08;UGC&#xff09;作為新的戰略重點。此舉標志著百度對UGC價值的重視與重塑&#xff0c;同時也預示著其旗下重要平臺——百度貼吧將迎來一輪重大的調…

C#模擬鼠標點擊,模擬鼠標雙擊,模擬鼠標恒定速度移動,可以看到軌跡

C#模擬鼠標點擊&#xff0c;模擬鼠標雙擊&#xff0c;模擬鼠標恒定速度移動&#xff0c;可以看到軌跡 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namespa…

QGIS提取全國景區經緯度的完整流程

一、數據獲取與預處理 數據來源選擇 全國A級景區數據可從各省文化和旅游廳官網、國家文化和旅游部網站或第三方GIS數據平臺獲取。推薦使用2020-2021年更新的矢量數據&#xff08;shp格式&#xff09;或Excel表格&#xff0c;其中包含景區名稱、地址、等級及WGS84經緯度信息。例…

如何進行postgreSQL專家認證

進行 PostgreSQL 專家認證主要有信創 PostgreSQL 認證和中國 PostgreSQL 考試認證等方式&#xff0c;以下以信創 PostgreSQL 認證為例介紹具體步驟&#xff1a; 了解認證體系 信創 PostgreSQL 認證由工信部人才交流中心組織及頒發證書&#xff0c;包括以下三個級別&#xff1a;…

【前端】【webpack-dev-server】proxy跨域代理

參考&#xff1a;https://www.bilibili.com/video/BV1c5SnYZEnZ?spm_id_from333.788.videopod.episodes&vd_source65c8707649747fd67b232866b69a5ebd&p138

批量在 Word 的指定位置插入頁,如插入封面、末尾插入頁面

我們經常會碰到需要在 Word 文檔中插入新的頁面的需求&#xff0c;比如在 Word 文檔末尾插入一個廣告頁、給 Word 文檔插入一個說明封面&#xff0c;在 Word 文檔的中間位置插入新的頁面等等。相信這個操作對于大部分小伙伴來說都不難&#xff0c;難的是同時給多個 Word 文檔插…

在Windows 11的WSL中安裝Kali Linux

Kali Linux 是網絡安全從業者和愛好者的首選工具集&#xff0c;但直接在物理機或虛擬機上運行可能占用較多資源。借助 Windows Subsystem for Linux (WSL)&#xff0c;我們可以在Windows 11中原生運行Kali Linux&#xff0c;輕量且高效。本教程將手把手教你如何在WSL2中安裝并配…

Flow Size Prediction with Short Time Gaps

Flow Size Prediction with Short Time Gaps 網絡流量預測新突破&#xff1a;微秒級短流預測的可行性分析 在當今數據中心和云計算環境中&#xff0c;網絡流量的精準預測是優化資源分配、實現智能負載均衡的關鍵。傳統流量和預測聚焦于長時間間隔&#xff08;如秒級或分鐘級&…

pandas——to_datatime用法

Pandas中pd.to_datetime的用法及示例 pd.to_datetime 是 Pandas 庫中用于將字符串、整數或列表轉換為日期時間&#xff08;datetime&#xff09;對象的核心函數。它在處理時間序列數據時至關重要&#xff0c;能夠靈活解析多種日期格式并統一為標準時間類型。以下是其核心用法及…

數學建模:MATLAB強化學習

一、強化學習簡述 強化學習是一種通過與環境交互&#xff0c;學習狀態到行為的映射關系&#xff0c;以獲得最大積累期望回報的方法。包含環境&#xff0c;動作和獎勵三部分&#xff0c;本質是智能體通過與環境的交互&#xff0c;使得其作出的動作所得到的決策得到的總的獎勵達…

【leetcode hot 100 160】相交鏈表

解法一&#xff1a;&#xff08;哈希集合&#xff09;利用HashSet保存一個鏈表的值&#xff0c;循環另一個列表&#xff0c;在HashSet中尋找該值。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x…

19. 大數據-技術生態簡介

文章目錄 前言一、Hadoop介紹1. 簡介2. Hadoop發展史3. Hadoop現狀 二、Hadoop特性1. Hadoop國外應用2. Hadoop國內應用 三、Hadoop架構變遷1. 發行版本2. Hadoop架構變遷(1.0-2.0變遷)3. Hadoop架構變遷(3.0新版本)4. 綜述 四、技術生態體系 前言 大數據&#xff08;Big Data…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)示例3: 行選擇

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 Deep…

VsCode 快捷鍵備忘

移動光標及選擇文本 Ctrl ← / → &#xff1a;以單詞為單位移動游標Home / End&#xff1a;光標移到行首/行位Ctrl Home / End&#xff1a;光標移到文件首和文件尾Ctrl Shift \&#xff1a;在匹配的分隔符之間跳轉 配對的分隔符 是指分隔代碼元素的字符&#xff0c;比如字…

用數據喚醒深度好眠,時序數據庫 TDengine 助力安提思腦科學研究

在智能醫療與腦科學快速發展的今天&#xff0c;高效的數據處理能力已成為突破創新的關鍵。安提思專注于睡眠監測與神經調控&#xff0c;基于人工智能和邊緣計算&#xff0c;實現從生理體征監測、智能干預到效果評估的閉環。面對海量生理數據的存儲與實時計算需求&#xff0c;安…

SQL_語法

1 數據庫 1.1 新增 create database [if not exists] 數據庫名; 1.2 刪除 drop database [if exists] 數據庫名; 1.3 查詢 (1) 查看所有數據庫 show databases; (2) 查看當前數據庫下的所有表 show tables; 2 數據表 2.1 新增 (1) 創建表 create table [if not exists…

Qt 開發 OpenGL 程序流程

在用 Qt 開發 OpenGL 程序時&#xff0c;整體的工作流程分為幾個關鍵步驟&#xff0c;最終目的是將數據傳遞給 GPU 并開始渲染。這一過程涉及到從代碼編寫到與著色器連接的多個操作&#xff0c;下面我將詳細講解每個步驟。 1. 設置 Qt 項目 這個步驟是準備工作&#xff0c;你首…

長短期記憶網絡(LSTM)學習指南

長短期記憶網絡&#xff08;LSTM&#xff09;學習指南 1. 定義和背景 長短期記憶網絡&#xff08;Long Short-Term Memory, LSTM&#xff09;是一種遞歸神經網絡&#xff08;RNN&#xff09;的變體&#xff0c;旨在解決傳統RNN在處理長期依賴關系時遇到的梯度消失或爆炸問題。…

仿12306項目(4)

基本預定車票功能的開發 對于乘客購票來說&#xff0c;需要有每一個車次的余票信息&#xff0c;展示給乘客&#xff0c;供乘客選擇&#xff0c;因此首個功能是余票的初始化&#xff0c;之后是余票查詢&#xff0c;這兩個都是控臺端。對于會員端的購票&#xff0c;需要有余票查詢…

第十二屆藍橋杯 異或數列

原題&#xff1a; https://www.acwing.com/problem/content/3424/ 題目大意&#xff1a; A、B兩人的數初始值均為0&#xff0c;他們輪流從X數組中取數&#xff0c;可以將該數與自己的數或對方的數進行異或操作&#xff0c;A先手&#xff0c;當X中的數被取完的時候誰的數大誰…