中介者模式(mediator)c++版本

这是大话设计模式是中的中介者模式的c++版本

/*
 * mediator.cpp
 *
 *  Created on: Oct 20, 2017
 *      Author: clh@163.com
 *      中介者模式:用一个中介对象来封装一系列的对象交互。
 *                中介者使各个对象不需要显式的相互引用,
 *                从而使其结构松散,而且可以独立的改变它
 *                们之间的交互。
 */
#include <iostream>
#include <string>

using namespace std;

//前置声明
class UnitedNations;

//国家类 相当于需要使用中介者沟通的对象
class Country
{
public:
    Country(UnitedNations* mediator):mediator_(mediator){}
protected:
    UnitedNations* mediator_;
};

//联合国类 相当于抽象中介者类
class UnitedNations
{
public:
    virtual ~UnitedNations(){}
    virtual void Declare(string name,Country* colleague)=0;
};

//国家类 相当于colleague类
class Usa:public Country
{
public:
    Usa(UnitedNations* mediator):Country(mediator){}
    void Declare(string message)
    {
        mediator_->Declare(message,this);
    }
    //获取消息
    void GetMessage(string message)
    {
        cout<<"美国获取对方的信息:"<<message<<endl;
    }
};

class Iraq:public Country
{
public:
    Iraq(UnitedNations* mediator):Country(mediator){}
    void Declare(string message)
    {
        mediator_->Declare(message,this);
    }
    //获取消息
    void GetMessage(string message)
    {
        cout<<"伊拉克获取对方的信息:"<<message<<endl;
    }
};

//安理会 相当于中介者实例
class UnitedNationsSecurityCouncil:public UnitedNations
{
public:
    //中介者了解所有对象所有拥有所有对象的属性
    void SetUsa(Usa* usa){_usa = usa;}
    Usa* GetUsa(){return _usa;}

    void SetIraq(Iraq* iraq){_iraq = iraq;}
    Iraq* GetIraq(){return _iraq;}

    //重写Declare实现通信
    void Declare(string message,Country* country) override
    {
        if(country == _usa)
        {
            _iraq->GetMessage(message);
        }else
        {
            _usa->GetMessage(message);
        }
    }
private:
    Usa* _usa;
    Iraq* _iraq;
};

int main()
{
    UnitedNationsSecurityCouncil* UNSC = new UnitedNationsSecurityCouncil();
    Usa *usa = new Usa(UNSC);
    Iraq *iraq = new Iraq(UNSC);

    UNSC->SetIraq(iraq);
    UNSC->SetUsa(usa);

    usa->Declare("不准研究核武器,不然就发动战争!");
    iraq->Declare("我们没有核武器,也不怕战争!");

    return 0;
}

程序输出:

clh@clh:~/testcode/设计模式$ g++ mediator.cpp -std=c++11
clh@clh:~/testcode/设计模式$ ./a.out 
伊拉克获取对方的信息:不准研究核武器,不然就发动战争!
美国获取对方的信息:我们没有核武器,也不怕战争!

以下内容摘抄自设计模式:
中介者模式适用于以下情况:
1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3.想定制一个分布在多个类中的行为,而又不想生成太多子类。

中介者模式的优点:
1.减少了子类的生成 mediator将原本分布与多个对象间的行为集中在一起。改变这些行为只需生成mediator的子类即可。这样各个colleague类可被重用。
2.它将各个colleague类解藕 你可以独立的改变和复用各colleague类和mediator类。
3.它简化了对象协议 用mediator和各colleague的一对多交互来代替多对多交互。
4.它对对象如何协作进行了抽象 将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。有助于弄清楚一个系统中的对象是如何交互的。
中介者模式的缺点:
1.它使控制集中化 中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变的比任何colleague都复杂。
转载请注明原地址:http://blog.csdn.net/clh01s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值