介紹
? ? ? ? 中介者模式用一個(gè)中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式,它是一種對象行為模式。
實(shí)現(xiàn)
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <unordered_map>
#include <atomic>
#include <vector>
#include <memory>
class Mediator;
class Colleague { // 抽象同事類
public:
Colleague(Mediator *mMediator);
virtual void method1() = 0; // 處理自己的行為
virtual void method2() = 0; // 與中介者進(jìn)行通訊
protected:
Mediator *m_mediator;
};
class Mediator { // 抽象中介者;
public:
void registerColleague(Colleague *colleague);
virtual void operation(Colleague *colleague) = 0;
protected:
std::vector<Colleague *> m_colleagues;
};
class ConcreteMediator : public Mediator { // 具體中介者
public:
void operation(Colleague *colleague) override;
};
class ConcreteColleagueA : public Colleague { // 具體同事類A
public:
ConcreteColleagueA(Mediator *mediator);
void method1() override;
void method2() override;
};
class ConcreteColleagueB : public Colleague { // 具體同事類B
public:
ConcreteColleagueB(Mediator *mediator);
void method1() override;
void method2() override;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
#include <thread>
#include <unistd.h>
#include <sstream>
Colleague::Colleague(Mediator *mMediator) : m_mediator(mMediator) {
}
void Mediator::registerColleague(Colleague *colleague) {
if (colleague) {
m_colleagues.push_back(colleague);
}
}
void ConcreteMediator::operation(Colleague *colleague) {
for (auto &c : m_colleagues) {
if (c != colleague) {
c->method1();
}
}
}
ConcreteColleagueA::ConcreteColleagueA(Mediator *mediator) : Colleague(mediator){
}
void ConcreteColleagueA::method1() {
std::cout << "ConcreteColleagueA處理自身邏輯" << std::endl;
}
void ConcreteColleagueA::method2() {
std::cout << "ConcreteColleagueA通知中介者" << std::endl;
if (m_mediator) {
m_mediator->operation(this);
}
}
ConcreteColleagueB::ConcreteColleagueB(Mediator *mediator) : Colleague(mediator){
}
void ConcreteColleagueB::method1() {
std::cout << "ConcreteColleagueB處理自身邏輯" << std::endl;
}
void ConcreteColleagueB::method2() {
std::cout << "ConcreteColleagueB通知中介者" << std::endl;
if (m_mediator) {
m_mediator->operation(this);
}
}
main.cpp
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
Mediator *mediator = new ConcreteMediator();
Colleague *colleagueA = new ConcreteColleagueA(mediator);
Colleague *colleagueB = new ConcreteColleagueB(mediator);
mediator->registerColleague(colleagueA);
mediator->registerColleague(colleagueB);
colleagueA->method2();
colleagueB->method2();
delete colleagueA;
delete colleagueB;
delete mediator;
return 0;
}
總結(jié)
優(yōu)點(diǎn)
? ? ? ? 1.?中介者模式簡化了對象之間的交互,它用中介者和同事的一對多交互代替了原來同事之間的多對多交互。一對多關(guān)系更容易理解、維護(hù)和擴(kuò)展,將原本難以理解的網(wǎng)狀結(jié)構(gòu)轉(zhuǎn)換成相對簡單的星形結(jié)構(gòu)。
? ? ? ? 2.?中介者模式可將各同事對象解耦。中介者有利于各同事之間的松耦合,可以獨(dú)立地改變和復(fù)用每一個(gè)同事和中介者,增加新的中介者和新的同事類都比較方便,更好地符合開閉原則。
? ? ? ? 3.?可以減少大量同事子類生成。中介者將原本分布于多個(gè)對象間的行為集中在一起,改變這些行為只需要生成新的中介者子類即可,這使得各個(gè)同事類可以被重用,無須對同事類進(jìn)行擴(kuò)展。
缺點(diǎn)
? ? ? ? 1.?在具體中介者類中包含了大量同事之間的交互細(xì)節(jié),可能會導(dǎo)致具體中介者類非常復(fù)雜,使得系統(tǒng)難以維護(hù)。
適用場景
? ? ? ? 1.?系統(tǒng)中對象之間存在復(fù)雜的引用關(guān)系,系統(tǒng)結(jié)構(gòu)混亂且難以理解。
? ? ? ? 2.?一個(gè)對象由于引用了其他很多對象并且直接和這些對象通信,導(dǎo)致難以復(fù)用該對象。
? ? ? ? 3.?想通過一個(gè)中間類來封裝多個(gè)類中的行為,而又不想生成太多的子類??梢酝ㄟ^引入中介者類來實(shí)現(xiàn),在中介者中定義對象交互的公共行為,如果需要改變行為則可以增加新的具體中介者類。
練習(xí)
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <unordered_map>
#include <atomic>
#include <vector>
#include <memory>
class Mediator;
class Pane { // 抽象同事類
public:
Pane(const std::string &name, Mediator *mediator);
virtual void update() = 0; // 處理自己的行為
virtual void tellOther() = 0; // 與中介者進(jìn)行通訊
protected:
Mediator *m_mediator;
std::string m_name;
};
class Mediator { // 抽象中介者;
public:
void registerPane(Pane *pane);
virtual void operation(Pane *pane) = 0;
protected:
std::vector<Pane *> m_panes;
};
class Window : public Mediator { // 具體中介者
public:
void operation(Pane *pane) override;
};
class TextPane : public Pane { // 具體同事類TextPane
public:
TextPane(const std::string &name, Mediator *mediator);
void update() override;
void tellOther() override;
};
class ListPane : public Pane { // 具體同事類ListPane
public:
ListPane(const std::string &name, Mediator *mediator);
void update() override;
void tellOther() override;
};
class GraphicPane : public Pane { // 具體同事類GraphicPane
public:
GraphicPane(const std::string &name, Mediator *mediator);
void update() override;
void tellOther() override;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp文章來源:http://www.zghlxwxcb.cn/news/detail-820000.html
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
#include <thread>
#include <unistd.h>
#include <sstream>
Pane::Pane(const std::string &name, Mediator *mediator) : m_name(name), m_mediator(mediator) {
}
void Mediator::registerPane(Pane *pane) {
if (pane) {
m_panes.push_back(pane);
}
}
void Window::operation(Pane *pane) {
for (auto &c : m_panes) {
if (c != pane) {
c->update();
}
}
}
TextPane::TextPane(const std::string &name, Mediator *mediator) : Pane(name, mediator){
}
void TextPane::update() {
std::cout << m_name << "更新顯示" << std::endl;
}
void TextPane::tellOther() {
std::cout << m_name << "通知Window" << std::endl;
if (m_mediator) {
m_mediator->operation(this);
}
}
ListPane::ListPane(const std::string &name, Mediator *mediator) : Pane(name, mediator){
}
void ListPane::update() {
std::cout << m_name << "更新顯示" << std::endl;
}
void ListPane::tellOther() {
std::cout << m_name << "通知Window" << std::endl;
if (m_mediator) {
m_mediator->operation(this);
}
}
GraphicPane::GraphicPane(const std::string &name, Mediator *mediator) : Pane(name, mediator){
}
void GraphicPane::update() {
std::cout << m_name << "更新顯示" << std::endl;
}
void GraphicPane::tellOther() {
std::cout << m_name << "通知Window" << std::endl;
if (m_mediator) {
m_mediator->operation(this);
}
}
main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-820000.html
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
Mediator *mediator = new Window();
Pane *text = new TextPane("text", mediator);
Pane *list = new ListPane("list", mediator);
Pane *graphic = new ListPane("graphic", mediator);
mediator->registerPane(text);
mediator->registerPane(list);
mediator->registerPane(graphic);
std::cout << "-------------------------" << std::endl;
text->tellOther();
std::cout << "-------------------------" << std::endl;
list->tellOther();
std::cout << "-------------------------" << std::endl;
graphic->tellOther();
std::cout << "-------------------------" << std::endl;
delete text;
delete list;
delete graphic;
delete mediator;
return 0;
}
到了這里,關(guān)于《設(shè)計(jì)模式的藝術(shù)》筆記 - 中介者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!