1. 程式人生 > >C++設計模式(二十一)—中介者模式

C++設計模式(二十一)—中介者模式

中介者模式

用一箇中介物件來封裝一系列的物件互動。中介者使個各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。

本文講解中介者模式框架,程式碼使用C++語言描述,程式碼存在的不足或問題有望各位指出。

中介者模式程式碼框架
//中介者模式
#include <iostream>
#include <string>
using namespace std;
class Colleague;
class ConcreteColleague1;
class ConcreteColleague2;
class Mediator
{
public
: virtual ~Mediator(){} virtual void send(string message, Colleague *colleague) =0; protected: Mediator(){} }; class Colleague { public: virtual ~Colleague(){} protected: Colleague(){} Colleague(Mediator *mediator) { this->mediator = mediator; } protected
: Mediator *mediator =nullptr; }; class ConcreteMediator : public Mediator { public: ConcreteMediator(){} ~ConcreteMediator(){} void setColleague1(ConcreteColleague1 *colleague1) { this->colleague1 = colleague1; } void setColleague2(ConcreteColleague2 *colleague2) { this
->colleague2 = colleague2; } void send(string message, Colleague *colleague) override; private: ConcreteColleague1 *colleague1; ConcreteColleague2 *colleague2; }; class ConcreteColleague1: public Colleague { public: ConcreteColleague1(Mediator *mediator) { this->mediator = mediator; } void send(string message) { mediator->send(message,this); } void notify(string message) { cout << "同事1得到訊息:" << message <<endl; } }; class ConcreteColleague2: public Colleague { public: ConcreteColleague2(Mediator *mediator) { this->mediator = mediator; } void send(string message) { mediator->send(message,this); } void notify(string message) { cout << "同事2得到訊息:" << message <<endl; } }; void ConcreteMediator::send(string message, Colleague *colleague) { if(colleague == colleague1 ) { colleague2->notify(message); } else { colleague1->notify(message); } } int main() { ConcreteMediator *m = new ConcreteMediator(); ConcreteColleague1 *c1 = new ConcreteColleague1(m); ConcreteColleague2 *c2 = new ConcreteColleague2(m); m->setColleague1(c1); m->setColleague2(c2); c1->send("吃過飯了嗎?"); c2->send("沒有呢,你打算請客嗎?"); delete m; delete c1; delete c2; return 0; }

中介者模式優缺點

1、中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了‘多對多’互動複雜的物件群時,不要急於使用中介者模式,而要先反思你的系統在設計上是不是合理。

2、Mediator的出現減少了各個Colleague的耦合,使得可以獨立地改變和複用各個Colleague類和Mediator;其次,由於把物件如何協作進行了抽象,將中介作為一個獨立的概念並將其封裝在一個物件中,這樣關注的物件就從物件各自本身的行為轉移到它們之間的互動上來,也就是站在一個更巨集觀的角度去看待系統。

3、由於ConcreteMediator控制了集中化,於是就把互動複雜性變為了中介者的複雜性,這就使得中介者會變得比任何一個ConcreteColleague都複雜。

相關推薦

C++設計模式中介模式

中介者模式 用一箇中介物件來封裝一系列的物件互動。中介者使個各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。 本文講解中介者模式框架,程式碼使用C++語言描述,程式碼存在的不足或問題有望各位指出。 中介者模式程式碼框

一個故事貫穿設計模式中介模式

   這裡記錄的是中介者模式。  在解耦上面具有重要的意義。 包結構: 類結構: 測試入口: package com.automannn.design_mode.mediator.test; import com.automannn.design

設計模式中介模式

中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者使各物件不需要顯示地相互引用,從未使其耦合鬆散,而且可以獨立地改變他們之間的互動 類圖的來源: public abstract class Mediator { public

設計模式筆記 —— 中介模式

中介者模式(Mediator):用一箇中介者物件來封裝一系列的物件互動。中介者物件使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立的改變它們之間的互動。中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現了“多對多”互動複雜的物件群時,不要急於使用中介者

軟體設計模式學習中介模式

> 對於那些存在物件之間複雜互動關係的系統,中介者模式提供了一種簡化複雜互動的解決方案,即通過引入一箇中介者,將原本物件之間的兩兩互動轉化為每個物件與中介者之間的互動 ## 模式動機 以微信聊天為例,可以使用者與使用者直接聊天,也可以通過微信群聊天。前者的話,使用者要和別的使用者加為好友,即使用者

雲端計算設計模式——Sharding分片模式

雲端計算設計模式(二十一)——Sharding分片模式將一個資料儲存到一組水平分割槽或碎片。儲存和訪問大量資料時,這個模式可以提高可擴充套件性。背景和問題由一個單一的伺服器託管的資料儲存區可能會受到以下限制:•儲存空間。一種資料儲存為一個大型雲應用可以預期含有資料量巨大,可以

設計模式—— 狀態模式

uml public bubuko interface 對象 con 原理 處理 環境 模式簡介 允許一個對象在其內部狀態改變時改變它的行為。對象看起來似乎修改了它的類。 在某些情況下,一個對象的行為取決於它當前所處的狀態,當對象屬性(狀態)在系統運行過程中發生變化,

行為型:設計模式之迭代器模式

 20世紀80年代,那時我家有一臺“古老的”電視機,牌子我忘了,只記得是臺黑白電視機,沒有遙控器,每次開關機或者換臺都需要通過電視機上面的那些按鈕來完成,我印象最深的是那個用來換臺的按鈕,需要親自用手去旋轉(還要使點勁才能擰動),每轉一下就“啪”的響一聲,如果沒有收到任何電視訊道就會出現一片讓人眼花的雪花點。

設計模式——直譯器模式(Spring 框架中SpelExpressionParser原始碼分析

1 四則運算問題 通過直譯器模式來實現四則運算,如計算 a+b-c 的值,具體要求 1) 先輸入表示式的形式,比如 a+b+c-d+e,  要求表示式的字母不能重複 2) 在分別輸入 a ,b, c, d, e 的值 3) 最後求出結果:如

階構造模式

C++ 二階構造 半成品對象 我們之前學習了構造函數,類的構造函數用於對象的初始化。構造函數與類同名並且沒有返回值,構造函數在對象定義時自動被定義。那麽我們就思考下:1、如何判斷構造函數的執行結果呢?2、在構造函數中執行 return 語句會發生什麽呢?3、構造函數執行結束是否意味

Kafka設計解析關於Kafka冪等producer的討論

不同 .cn stat ali 就是 額外 ber nec local 轉載自 huxihx,原文鏈接 關於Kafka冪等producer的討論 眾所周知,Kafka 0.11.0.0版本正式支持精確一次處理語義(exactly once semantics,下稱E

Kafka設計解析Kafka水位(high watermark)與leader epoch的討論

副本 ade 方式 這樣的 不一致 如果 文件中 rep 經典 轉載自 huxihx,原文鏈接 Kafka水位(high watermark)與leader epoch的討論 本文主要討論0.11版本之前Kafka的副本備份機制的設計問題以及0.11是如何解決的。簡

雲端計算設計模式——僕人鍵模式

雲端計算設計模式(二十四)——僕人鍵模式使用一個令牌或金鑰,向客戶提供受限制的直接訪問特定的資源或服務,以便由應用程式程式碼解除安裝資料傳輸操作。這個模式是在使用雲託管的儲存系統或佇列的應用中特別有用,並且可以最大限度地降低成本,最大限度地提高可擴充套件性和效能。背景和問題客

設計模式C++實現中介模式

中介者模式(Mediator):用一箇中介物件來封裝一系列的物件互動。中介者是各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。 中介者模式很容易在系統中應用,也很容易在系統中誤用。當系統出現多對多互動複雜的物件群是,不要急於使用中介者模式,而

設計模式---狀態模式

inter man 每一個 con ret ride text src 定義 1、簡介   定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。   狀態模式允許一個對象在其內部狀態改變時改變其行為,這個對象看上去就像改變

C之 #error 和 #line

C語言 #error #line 我們今天來講下 C 語言中的兩個比較偏僻的知識點,之所以說偏僻是因為在平時的代碼中我們見得很少。首先來說下 #error,它是用於生成一個編譯錯誤消息。用法如下:#error message;註意 message 不需要用雙引號包圍。#error

狀態模式詳解DOTA版

作者:zuoxiaolong8810(左瀟龍),轉載請註明出處,特別說明:本博文來自博主原部落格,為保證新部落格中博文的完整性,特複製到此留存,如需轉載請註明新部落格地址即可。                本次LZ

設計模式建造模式

用程式畫一個小人,這在遊戲程式裡非常常見。現在簡單一點,要求是小人要有頭、身體、兩手、兩腳就可以了。 第一版  Pen p = new Pen (Color.Yellow); Graphics gThin = pictureBox1.CreateGraphics();

C++ — 引用概念及本質

color 概念 調用 main 字節 sizeof 一個 strong 操作 1、引用概念   引用是別名,必須在聲明的時候初始化。即:是指一個已定義變量的別名。(一個內存空間,有兩個名字都可以操作)   引用:在函數調用時,是變量的別名,不可以單獨存在,使用時必須要

訪問者模式 Visitor 行為型 設計模式

訪問者模式 Visitor 《俠客行》是當代作家金庸創作的長篇武俠小說,新版電視劇《俠客行》中,開篇有一段獨白:  “茫茫海外,傳說有座俠客島,島上賞善罰惡二使,每隔十年必到中原武林,向各大門派下發放賞善罰惡令, 強邀掌門人赴島喝臘八粥,拒接令者,皆造屠