国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《設(shè)計(jì)模式的藝術(shù)》筆記 - 中介者模式

這篇具有很好參考價(jià)值的文章主要介紹了《設(shè)計(jì)模式的藝術(shù)》筆記 - 中介者模式。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

介紹

? ? ? ? 中介者模式用一個(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

//
// 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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式之中介者模式

    設(shè)計(jì)模式之中介者模式

    詳細(xì)介紹 ????????中介者模式(Mediator Pattern)是一種行為設(shè)計(jì)模式, 它通過定義一個(gè)中介類來封裝多個(gè)對象之間的交互,使各對象不需要顯示地相互引用,從而降低耦合度,提高系統(tǒng)的可維護(hù)性和靈活性。中介者模式將原本一對多的網(wǎng)狀關(guān)系轉(zhuǎn)變?yōu)橐粚Χ嗟年P(guān)系,即每個(gè)

    2024年04月29日
    瀏覽(47)
  • 設(shè)計(jì)模式(十七)中介者

    設(shè)計(jì)模式(十七)中介者

    義一個(gè)對象來封裝一系列的對象交互。中介者模式使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以讓你相對獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停模式,它是一種對象說行為型模式。 在中介者模式中,引入了用于協(xié)調(diào)其他對象/類之間的相互調(diào)用

    2024年02月04日
    瀏覽(21)
  • 大話設(shè)計(jì)模式之中介者模式

    大話設(shè)計(jì)模式之中介者模式

    中介者模式是一種行為型設(shè)計(jì)模式,它通過引入一個(gè)中介者對象來封裝一系列對象之間的交互,從而減少對象之間的直接通信,使得對象之間的耦合度降低,同時(shí)提高了系統(tǒng)的可維護(hù)性和靈活性。 在中介者模式中,對象之間的通信不再直接發(fā)生,而是通過中介者對象來進(jìn)行。

    2024年04月16日
    瀏覽(24)
  • Java設(shè)計(jì)模式-中介者模式

    中介者模式,就是用一個(gè)中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地互相引用,從而使其耦合松散,而且可以獨(dú)立的改變它們之間的交互。 其實(shí)中介者模式很簡單的,就像它的名字一樣,中介,調(diào)用某個(gè)類的某些方法的時(shí)候,我們不直接去跟那個(gè)類的實(shí)

    2024年02月15日
    瀏覽(22)
  • 行為型設(shè)計(jì)模式——中介者模式

    行為型設(shè)計(jì)模式——中介者模式

    中介者模式主要是將關(guān)聯(lián)關(guān)系由一個(gè)中介者類統(tǒng)一管理維護(hù),一般來說,同事類之間的關(guān)系是比較復(fù)雜的,多個(gè)同事類之間互相關(guān)聯(lián)時(shí),他們之間的關(guān)系會呈現(xiàn)為復(fù)雜的網(wǎng)狀結(jié)構(gòu),這是一種過度耦合的架構(gòu),即不利于類的復(fù)用,也不穩(wěn)定。例如在下左圖中,有六個(gè)同事類對象

    2024年01月18日
    瀏覽(23)
  • 設(shè)計(jì)模式- 中介者模式(Mediator)

    設(shè)計(jì)模式- 中介者模式(Mediator)

    中介者模式(Mediator Pattern),是一種對象行為型模式。該模式的主要目的是定義一個(gè)中介對象來封裝一系列對象之間的交互,使原有對象之間的耦合變得松散,并且可以獨(dú)立地改變它們之間的交互。 抽象中介者(Mediator) :這是中介者模式的核心接口,它定義了同事對象注

    2024年04月26日
    瀏覽(26)
  • C++ 設(shè)計(jì)模式之 中介者模式

    C++ 設(shè)計(jì)模式之 中介者模式

    【聲明】本題目來源于卡碼網(wǎng)(題目頁面 (kamacoder.com)) 【提示:如果不想看文字介紹,可以直接跳轉(zhuǎn)到C++編碼部分】 ? ? ? ? -- 什么是中介者模式? (第16種模式) ??????? ?中介者模式 (Mediator Pattern)也被稱為 調(diào)停者模式 ,是?種 ?為型設(shè)計(jì)模式 ,它通過?個(gè)中介

    2024年01月19日
    瀏覽(21)
  • 經(jīng)典的設(shè)計(jì)模式17——中介者模式

    定義: 用一個(gè)中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變他們之間的交互。 結(jié)構(gòu): 抽象中介者角色:是中介者的接口,提供了同事對象注冊與轉(zhuǎn)發(fā)同事對象信息的抽象方法。 具體中介者角色:實(shí)現(xiàn)中

    2024年02月09日
    瀏覽(23)
  • 設(shè)計(jì)模式—行為型模式之中介者模式

    設(shè)計(jì)模式—行為型模式之中介者模式

    中介者模式(Mediator Pattern):用一個(gè)中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,減少對象間混亂的依賴關(guān)系,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。對象行為型模式。 包含以下角色: Mediator: 抽象中介者 ConcreteMediator: 具體中

    2024年01月16日
    瀏覽(18)
  • 設(shè)計(jì)模式-行為型模式之中介者模式

    設(shè)計(jì)模式-行為型模式之中介者模式

    在用戶與用戶直接聊天的設(shè)計(jì)方案中,用戶對象之間存在很強(qiáng)的 關(guān)聯(lián)性 ,將導(dǎo)致系統(tǒng)出現(xiàn)如下問題: 對象之間存在大量的相互關(guān)聯(lián)和調(diào)用,若有一個(gè)對象發(fā)生變化,則需要跟蹤和該對象關(guān)聯(lián)的其他所有對象,并進(jìn)行適當(dāng)處理。 由于一個(gè)對象和其他對象具有很強(qiáng)的關(guān)聯(lián),若沒

    2023年04月23日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包