• 中介者模式


    中介者(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;
    }

    效果:

  • 相关阅读:
    在VS2010下,用QT,创建一个Opencv应用程序
    SNR(信噪比)与 特定分布噪声的关系初探
    Qt学习笔记_FindDialog
    关于reduced rank regression的一些看法
    实时摄像头人眼跟踪: RealTime Tracking Of Human Eyes Using a Webcam
    L1_APG_Tracker实现代码剖析
    CVPR2013 感兴趣论文汇总
    使用PowerDesigner 15对现有数据库进行反向工程(图解教程)(转)
    大数据量高并发的数据库优化
    rtmp和rtsp的区别
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6879722.html
Copyright © 2020-2023  润新知