C++与设计模式(13)——中介者模式

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

中介者模式的意义

现在在我们的程序中有很多共同工作的类:
这里写图片描述
假如它们之间互相关联,在这样的情况下,如果要修改B类,那么也会对ACD类产生影响,而对于中介者模式:
这里写图片描述
可以修改任意一个类而只对中介类产生影响。
这就是中介者模式的意义:将一个复杂的网状的类的结构转换为简单的星型结构

简单的例子

我们来为一个团队提供一个交流平台:

class Mediator;
//抽象人
class People
{
public:
    People(string name):m_name(name),m_mediator(NULL){}
    virtual ~People(){}
    void SetMediator(Mediator *mediator){m_mediator = mediator;}
    virtual void sendMessage(string str){}
    virtual void getMessage(string str){}
protected:
    string m_name;
    Mediator *m_mediator;//使用的聊天平台
};

//抽象的聊天平台
class Mediator
{
public:
    void addPeople(People *people){peopleList.push_back(people);}
    virtual void sendMessage(string str, People *people){}

protected:
    list<People*> peopleList;
};


class PeopleA : public People
{
public:
    PeopleA(string name):People(name){}
    virtual void sendMessage(string str)
    {
        if(m_mediator != NULL)
            m_mediator->sendMessage(str,this);
    }
    virtual void getMessage(string str){cout << m_name << " get message:" << str << endl;}
};

class MediatorA : public Mediator
{
public:
    virtual void sendMessage(string str, People *people)
    {
        for(People *p : peopleList)
            if(p != people)
                p->getMessage(str);
    }
};

int main()
{
    PeopleA *jack = new PeopleA("jack");
    PeopleA *david = new PeopleA("david");
    PeopleA *darcy = new PeopleA("darcy");

    MediatorA mediator;
    mediator.addPeople(jack);
    mediator.addPeople(david);
    mediator.addPeople(darcy);

    jack->SetMediator(&mediator);
    david->SetMediator(&mediator);
    darcy->SetMediator(&mediator);

    jack->sendMessage("Hello");

    return 0;
}

输出:

david get message:Hello
darcy get message:Hello

其他

  1. 中介者模式的本质在于“封装交互”
    中介者模式的目的,就是封装多个对象的交互,这些交互的多在中介者对象里实现,而对象本身无需知道交互的具体内容。(中介骗钱很轻松欧)
    只要是实现封装对象的交互,就可以使用中介者模式,不必拘泥于模式结构。

  2. 需注意如果当前类的联系并不复杂,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值