设计模式C++实现笔记

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

2019-03-14  本文已影响0人  lixin_karl

介绍

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

参与者

实现代码

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: 我很好!

特点

参考

上一篇 下一篇

猜你喜欢

热点阅读