• 中介者模式


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

    以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式

    #include <iostream>
    #include <string>
    
    
    class IMediator;
    
    class IPerson
    {
    public:
        IPerson() {}
        virtual ~IPerson() {}
        
        virtual void setMediator(IMediator * mediator) = 0;
        virtual void sendMsg(const std::string &msg) = 0;
        virtual void getMsg(const std::string &msg) = 0;
    
    protected:
        IMediator *m_mediator;
    };
    
    class IMediator
    {
    public:
        IMediator() = default;
        virtual ~IMediator() = default;
        
        virtual void sendMsg(const std::string &msg, IPerson *p) = 0;
        virtual void setA(IPerson *A) = 0;
        virtual void setB(IPerson *B) = 0;
    };
    
    class CHouseMediator : public IMediator
    {
    public:
        CHouseMediator() : m_A(nullptr), m_B(nullptr) {}
        ~CHouseMediator() = default;
        
        void setA(IPerson *A) override
        {
            m_A = A;
        }
    
        void setB(IPerson *B) override
        {
            m_B = B;
        }
    
        void sendMsg(const std::string &msg, IPerson *p) override
        {
            if (p == m_A)
                m_B->getMsg(msg);
            else
                m_A->getMsg(msg);
        }
    
    private:
        IPerson *m_A;
        IPerson *m_B;
    };
    
    class CCustomer : public IPerson
    {
    public:
        CCustomer() {}
        ~CCustomer() {}
        
        void setMediator(IMediator * mediator) override
        {
            m_mediator = mediator;
        }
    
        void sendMsg(const std::string &msg) override
        {
            m_mediator->sendMsg(msg, this);
        }
    
        void getMsg(const std::string &msg) override
        {
            std::cout << "买方收到信息: " << msg << '
    ';
        }
    };
    
    class CLandlord : public IPerson
    {
    public:
        CLandlord() {}
        ~CLandlord() {}
        
        void setMediator(IMediator * mediator) override
        {
            m_mediator = mediator;
        }
    
        void sendMsg(const std::string &msg) override
        {
            m_mediator->sendMsg(msg, this);
        }
    
        void getMsg(const std::string &msg) override
        {
            std::cout << "卖方收到信息: " << msg << '
    ';
        }
    };
    
    
    int main()
    {
        IMediator *mediator = new CHouseMediator();
        IPerson *p1 = new CCustomer();
        IPerson *p2 = new CLandlord();
    
        mediator->setA(p1);
        mediator->setB(p2);
        p1->setMediator(mediator);
        p2->setMediator(mediator);
    
        p1->sendMsg("买一套上海的200平大房子");
        p2->sendMsg("出售一套上海200平大房子");
    
        delete mediator;
        delete p1;
        delete p2;
    
        return 0;
    }
  • 相关阅读:
    根据输入的个数,打印每行做多输出3个的for循环
    在启动页面后面再加载一个广告页,可以定制动画等
    frame.size.height无法直接赋值问题
    iOS开发远程推送
    iOS——UIKeyboardWillShowNotification 监听键盘高度变化
    iOS 浅谈本地通知 UILocalNotification
    iOS中assign、copy 、retain等关键字的含义
    GCD
    xocde快速定位崩溃代码
    关于xcode打包app
  • 原文地址:https://www.cnblogs.com/zuofaqi/p/10470812.html
Copyright © 2020-2023  润新知