概念
中介者模式是一種行為模式, 他的核心思想是通過引入一個中介者對象,將多個對象之間的復雜交互邏輯統一管理。每個對象只需要與中介者通信,而不需要直接與其他對象交互,從而降低系統的耦合度。
適用場景
- 對象之間交互復雜:當對象之間的交互邏輯復雜且難以維護時。
- 減少依賴:當需要減少對象之間的直接依賴時。
- 集中管理交互:當需要集中管理對象之間的交互邏輯時。
創建方式
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;
};
歡迎東哥來到設計模式的世界!
五:你好,我是第五個好友
一:你好,我是第一個好友
二:你好,我是第二個好友
三:你好,我是第三個好友
四:你好,我是第四個好友
五:大家好