MEDIATOR 中介者模式(行為模式)

介紹

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

參與者

  • Mediator: 抽象中介者。定義了同事對象到中介者對象之間的接口。
  • ConcreteMediator: 具體中介者。實現抽象中介者的方法,它需要知道所有的具體同事類,同時需要從具體的同事類那里接收信息,并且向具體的同事類發(fā)送信息。
  • Colleague: 抽象同事類。
  • ConcreteColleague: 具體同事類。每個具體同事類都只需要知道自己的行為即可,但是他們都需要認識中介者。

實現代碼

enum{
    Widget_A,
    Widget_B,
};
class Widget;
class Meadiator{
public:
    virtual void showMsg(std::string msg,Widget *meadiator) = 0;
};
class Widget{
public:
    Widget(int id_,Meadiator *meadiator1)
    {
        id = id_;
        meadiator = meadiator1;
    }
    virtual void showMe(std::string) = 0;
    int getId()
    {
        return id;
    }
public:
    Meadiator *meadiator;
    int id;
};
class WidgetA:public Widget{
public:
    WidgetA(int id,Meadiator *meadiator1):Widget(id,meadiator1)
    {
    }
    void showMe(std::string msg) override
    {
        std::cout<<"A: "<<msg<<std::endl;
    }
    void showMsg(std::string msg)
    {
        meadiator->showMsg(msg,this);
    }
};

lass WidgetB:public Widget{
public:
    WidgetB(int id,Meadiator *meadiator1):Widget(id,meadiator1)
    {

    }
    void showMe(std::string msg) override
    {
        std::cout<<"B: "<<msg<<std::endl;
    }
    void showMsg(std::string msg)
    {
        meadiator->showMsg(msg,this);
    }
};
class ConcreteMeadiator: public  Meadiator{
public:
    void SetWidgetA(WidgetA *widgetA1)
    {
        widgetA = widgetA1;
    }
    void SetWidgetB(WidgetB *widgetB1)
    {
        widgetB = widgetB1;
    }
    void showMsg(std::string msg,Widget *widget) override
    {
        if(widget->getId() == Widget_A)
        {
            widgetA->showMe(msg);
        }else if(widget->getId() == Widget_B)
        {
            widgetB->showMe(msg);
        }
    }
private:
    WidgetA *widgetA;
    WidgetB *widgetB;
};

int main()
{
    ConcreteMeadiator meadiator;
    auto *widgetA = new WidgetA(Widget_A,&meadiator);
    auto *widgetB = new WidgetB(Widget_B,&meadiator);
    meadiator.SetWidgetA(widgetA);
    meadiator.SetWidgetB(widgetB);
    widgetA->showMsg("你好?。?);
    widgetB->showMsg("我很好!");
}

輸出結果

A: 你好啊!
B: 我很好!

特點

  • 簡化了對象之間的關系,將系統的各個對象之間的相互關系進行封裝,將各個同事類解耦,使系統成為松耦合系統。
  • 減少了子類的生成。
  • 可以減少各同事類的設計與實現。
  • 由于中介者對象封裝了系統中對象之間的相互關系,導致其變得非常復雜,使得系統維護比較困難。

參考

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容