设计模式-中介者模式

最近在学习设计模式,之前都是看一遍,后来就忘了。所以还是决定记录一下
主要是学习大话设计模式这本书,把里面例子用c++重新写一遍
另外http://blog.csdn.net/column/details/design.html这个博主写得也不错,也参考一下。

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

中介者模式一般应用在一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
大话数据结构中的例子:如果国家之间有矛盾,两个国家直接进行外交,就会很复杂。可以通过联合国进行调停,这样每个国家只用和联合国进行交互。
UML:
这里写图片描述

class UnitedNations;
//抽象国家
class Country {                                                 
public:
protected:
    UnitedNations *UN;
public:
    Country(UnitedNations *mediator) :UN(mediator) {}
    virtual void SetMediator(UnitedNations *UN) {}
    virtual void SendMessage(string message) {}
    virtual void GetMessage(string message) {}
};
//联合国,抽象中介机构
class UnitedNations {
public:
    virtual void Send(string message, Country *country) {}

};
//美国
class USA :public Country
{
public:
    USA(UnitedNations *mediator) :Country(mediator) {}
    void SendMessage(string message)
    {
        UN->Send(message, this);                          //通过中介发送消息
    }
    void GetMessage(string message)
    {
        cout << "USAGetMessage:" << message<<endl;
    }
};
//伊朗
class Iraq :public Country
{
public:
    Iraq(UnitedNations *mediator) :Country(mediator) {}
    void SendMessage(string message)
    {
        UN->Send(message, this);
    }
    void GetMessage(string message)
    {
        cout << "IraqGetMessage:" << message<<endl;
    }
};
//联合国安理会,具体中介机构类
class UnitedNationsSecurityCouncil : public UnitedNations
{
private:
    Country *A;           
    Country *B;
public:
    void SetA(Country *country) { A = country; }
    void SetB(Country *country) { B = country; }
    void Send(string message, Country *country)
    {
        if (country == A)
            B->GetMessage(message);
        else
            A->GetMessage(message);
    }
};
int main()
{
    UnitedNationsSecurityCouncil *UNSC = new UnitedNationsSecurityCouncil();
    USA *usa = new USA(UNSC);
    Iraq *iraq = new Iraq(UNSC);
    UNSC->SetA(usa);
    UNSC->SetB(iraq);
    usa->SendMessage("不准研制核武器,否则发动战争");
    iraq->SendMessage("我们没有核武器,也不怕侵略");
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值