《大话设计模式》-- 第25个 中介者模式

中介者模式看了许久,不能理解其中的奥妙所在。但是不打算在这个模式上再多花时间,先在此记录下,日后代码熟练后在回过头来回顾一下。

模式目标:
中介者模式的目标是为了减少多个对象之间的交互,将一种网状的交互状态简化为星状的交互状态,这样就各个对象就需要通过一个中介来传送信息。

看了Gamma的设计模式一书中举的例子,此模式用在设计一个界面,界面上有按钮,下拉列表,输入框,这几种界面上的对象,如果有一种发生变化,其他对象相应的也要发生改变,比如下拉列表中如果选择了某种字体,那么对应的按钮和输入框中的字体也要发生改变,那么此时可以使用中介者模式来实现。

当然我看的是大话里面的,里面的代码相对来说简单一点,在此贴下代码,以便后面回顾:

#include <iostream>
using namespace std;
class Colleague;

// 中介者接口类,如果后续有多个中介,可以从此类派生
class Mediator
{
public:
    virtual void Send (string msg, Colleague* clg) = 0;
    virtual void CreateColleague () = 0;
};
// 交互对象超类,持有中介者对象,以便和中介打交道
class Colleague
{
protected:
    Mediator *mediator;
public:
    Colleague (Mediator *med) : mediator (med) {}
    virtual void Notify (string msg) {}
};

// 具体的交互对象
class ConcreteColleague1 : public Colleague
{
public:
    ConcreteColleague1 (Mediator *med) : Colleague (med) {}
    void Send (string msg)
    {   
        mediator->Send (msg, this);
    }   
    void Notify (string msg)
    {   
        cout << "ConcreteColleague1" << ": " << msg << endl;
    }   
};

class ConcreteColleague2 : public Colleague
{
public:
    ConcreteColleague2 (Mediator *med) : Colleague (med) {}
    void Send (string msg)
    {   
        mediator->Send (msg, this);
    }   
    void Notify (string msg)
    {   
        cout << "ConcreteColleague2" << ": " << msg << endl;
    }   
};
// 具体的中介者类,持有各个交互对象。
class ConcreteMediator : public Mediator
{
public:
    void Send (string msg, Colleague *clg);
protected:
    virtual void CreateColleague ();    
private:
    ConcreteColleague1 *clg1;
    ConcreteColleague2 *clg2;
};

void ConcreteMediator::CreateColleague ()
{
    clg1 = new ConcreteColleague1 (this);
    clg2 = new ConcreteColleague2 (this);
}

void ConcreteMediator::Send (string msg, Colleague *clg)
{
    if (clg == clg1)
    {   
        clg2->Notify (msg);
    }   
    else if (clg == clg2)
    {   
        clg1->Notify (msg);
    }   
}
#endif

代码有问题。 ConcreteMediator 这个类具体不知道怎么处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值