wanlifeipeng

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

中介者(Mediator)模式

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

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

 

代码:

#include <iostream>
#include <string>
using namespace std;


class Mediator;

class Person
{
public:
    virtual ~Person() {}
public:
    virtual void setMediator(Mediator *m) {}   // 设置中介
    virtual void sendMessage(string message){} // 发送消息
    virtual void getMessage(string message){} // 获取消息

protected:
    Mediator *_mediator;
};

class Mediator
{
public:
    virtual ~Mediator() {}
public:
    virtual void setLandlord(Person *p) {}  // 设置房东
    virtual void setRenter(Person *p) {}    // 设置租客
    virtual void sendMessage(string message, Person *p) {} // 转发消息
};

class Landlord : public Person
{
public:
    void setMediator(Mediator *m)
    {
        _mediator = m;
    }   

    void sendMessage(string message)
    {
        _mediator->sendMessage(message, this);
    } 

    void getMessage(string message)
    {
        cout << "房东收到租客发来的消息:" << message << endl;
    } 
};

class Renter : public Person
{
public:
    void setMediator(Mediator *m)
    {
        _mediator = m;
    }  

    void sendMessage(string message)
    {
        _mediator->sendMessage(message, this);
    } 

    void getMessage(string message)
    {
        cout << "租客收到房东发来的消息: " << message << endl;
    }
};

class HouseMediator : public Mediator
{
public:
    void setLandlord(Person *p)
    {
        _landlord = p;
    }

    void setRenter(Person *p)
    {
        _renter = p;
    }

    void sendMessage(string message, Person *p)
    {
        if (p == _landlord) // 房东发送信息
        {
            _renter->getMessage(message);
        }
        else   // 租客发送信息
        {
            _landlord->getMessage(message);
        }
    }

private:
    Person *_landlord;  // 房东
    Person *_renter; // 租客
};


void test()
{
    Mediator *mediator = new HouseMediator;  // 房屋中介
    Person *renter = new Renter;   // 租客
    Person *landlord = new Landlord;  // 房东
    mediator->setLandlord(landlord);
    mediator->setRenter(renter);
    renter->setMediator(mediator);
    landlord->setMediator(mediator);

    renter->sendMessage("我想在上海火车站附近租房子,一室一厅");
    landlord->sendMessage("我想出租一室一厅的房子,地点:上海火车站附近");


    delete mediator;
    delete renter;
    delete landlord;
}

int main()
{
    test();
    cin.get();
    return 0;
}

效果:

 

posted on 2017-05-19 20:57  wanlifeipeng  阅读(112)  评论(0编辑  收藏  举报