美文网首页
设计模式-行为模式-中介者模式

设计模式-行为模式-中介者模式

作者: 阿棍儿_Leon | 来源:发表于2020-04-29 22:17 被阅读0次

    中介者模式可以对多个对象之间的交互进行解耦。这个模式种有2类角色,一个是中介者,另一类是需要互相交互的对象。

    以下代码定义了中介者。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Mediator
    {
    public:
        virtual ~Mediator(){}
        virtual void Request() = 0;
        virtual void Register(class Colleague* colleague) = 0;
        virtual void UnRegister(class Colleague* colleague) = 0;
    };
    
    class ConcreteMediator:public Mediator
    {
    private:
        vector<class Colleague*> m_pColleagues;
    public:
        void Request();
        void Register(class Colleague* colleague);
        void UnRegister(class Colleague* colleague);
    };
    

    以下代码定义了交互对象。

    class Colleague
    {
    protected:
        Mediator* m_pMediator;
    public:
        Colleague(Mediator* mediator):m_pMediator(mediator)
        {
            m_pMediator->Register(this);
        }
        virtual void Request() = 0;
        virtual void Notify() = 0;
        virtual ~Colleague()
        {
            m_pMediator->UnRegister(this);
        }
    };
    
    class ConcreteColleague0:public Colleague
    {
    public:
        ConcreteColleague0(Mediator* mediator):Colleague(mediator){}
        void Request()
        {
            cout<<endl<<__PRETTY_FUNCTION__<<endl;
            m_pMediator->Request();
        }
        void Notify()
        {
            cout<<__PRETTY_FUNCTION__<<endl;
        }
    };
    
    class ConcreteColleague1:public Colleague
    {
    public:
        ConcreteColleague1(Mediator* mediator):Colleague(mediator){}
        void Request()
        {
            cout<<endl<<__PRETTY_FUNCTION__<<endl;
            m_pMediator->Request();
        }
        void Notify()
        {
            cout<<__PRETTY_FUNCTION__<<endl;
        }
    };
    

    以下代码是中介者的方法实现。

    void ConcreteMediator::Request()
    {
        for (auto it : m_pColleagues)
        {
            it->Notify();
        }
    }
    void ConcreteMediator::Register(Colleague* colleague)
    {
        m_pColleagues.push_back(colleague);
    }
    void ConcreteMediator::UnRegister(Colleague* colleague)
    {
        for (vector<Colleague*>::iterator it; it != m_pColleagues.end(); ++it)
        {
            if (*it == colleague)
            {
                m_pColleagues.erase(it);
            }
        }
    }
    

    以下代码演示了中介者交互过程,这里的实现类似于聊天室,一个对象发送,所有对象都收到消息。

    int main(void){
    
        Mediator* mediator = new ConcreteMediator();
        Colleague* C0 = new ConcreteColleague0(mediator);
        Colleague* C1 = new ConcreteColleague1(mediator);
        C0->Request();
        C1->Request();
        return 0;
    }
    

    输出

    
    virtual void ConcreteColleague0::Request()
    virtual void ConcreteColleague0::Notify()
    virtual void ConcreteColleague1::Notify()
    
    virtual void ConcreteColleague1::Request()
    virtual void ConcreteColleague0::Notify()
    virtual void ConcreteColleague1::Notify()
    

    相关文章

      网友评论

          本文标题:设计模式-行为模式-中介者模式

          本文链接:https://www.haomeiwen.com/subject/mocowhtx.html