`

[行为型模式] 中介者模式的理解

 
阅读更多




头文件
//MediatorPattern.h

#ifndef MEDIATOR_PATTERN_H
#define MEDIATOR_PATTERN_H

#include <Windows.h>
#include <iostream>
using namespace std;

namespace MediatorPattern
{
    class Mediator;
    class Colleague
    {
    public:
        Colleague(Mediator* pMediator);
        virtual void Send(const char* pszMsg) = 0;
        virtual void Notify(const char* pszMsg) = 0;

    protected:
        Mediator* m_pMediator;
    };

    class ConcreteColleagueA : public Colleague
    {
    public:
        ConcreteColleagueA(Mediator* pMediator);
        virtual void Send(const char* pszMsg);
        virtual void Notify(const char* pszMsg);
    };

    class ConcreteColleagueB : public Colleague
    {
    public:
        ConcreteColleagueB(Mediator* pMediator);
        virtual void Send(const char* pszMsg);
        virtual void Notify(const char* pszMsg);
    };

    //////////////////////////////////////////////////////////////////////////
    class Mediator
    {
    public:
        virtual void Send(const char* pszMsg, Colleague* pColleague) = 0;
    };

    class ConcreteMediator : public Mediator
    {
    public:
        virtual void Send(const char* pszMsg, Colleague* pColleague);

        void SetColleagueA(Colleague* pColleague);
        void SetColleagueB(Colleague* pColleague);

    private:
        // The Mediator knows all the Colleague
        ConcreteColleagueA* m_pConcreteColleagueA;
        ConcreteColleagueB* m_pConcreteColleagueB;
    };

    //////////////////////////////////////////////////////////////////////////
    void MediatorPattern_Test();
}

#endif


实现
#include "MediatorPattern.h"
#include <iostream>
using namespace std;

#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

namespace MediatorPattern
{
    //////////////////////////////////////////////////////////////////////////
    Colleague::Colleague(Mediator* pMediator)
        : m_pMediator(pMediator)
    {
        cout << "Colleague::Colleague" << endl;
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteColleagueA::ConcreteColleagueA(Mediator* pMediator)
        : Colleague(pMediator)
    {
        cout << "ConcreteColleagueA::ConcreteColleagueA" << endl;
    }

    void ConcreteColleagueA::Send(const char* pszMsg)
    {
        cout << "ConcreteColleagueA::Send" << endl;
        cout << "Send request to Mediator:" << pszMsg << endl;
        m_pMediator->Send(pszMsg, this);
    }

    void ConcreteColleagueA::Notify(const char* pszMsg)
    {
        cout << "ConcreteColleagueA::Notify " << endl;
        cout << "Receive response from Mediator:" << pszMsg << endl;
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteColleagueB::ConcreteColleagueB(Mediator* pMediator)
        : Colleague(pMediator)
    {
        cout << "ConcreteColleagueA::ConcreteColleagueB" << endl;
    }

    void ConcreteColleagueB::Send(const char* pszMsg)
    {
        cout << "ConcreteColleagueB::Send" << endl;
        cout << "Send request to Mediator:" << pszMsg << endl;
        m_pMediator->Send(pszMsg, this);
    }

    void ConcreteColleagueB::Notify(const char* pszMsg)
    {
        cout << "ConcreteColleagueB::Notify " << endl;
        cout << "Receive response from Mediator:" << pszMsg << endl;
    }

    //////////////////////////////////////////////////////////////////////////
    void ConcreteMediator::Send(const char* pszMsg, Colleague* pColleague)
    {
        cout << "ConcreteMediator::Send -> GetMessage:" << pszMsg << endl;

        ConcreteColleagueA* pTemp = dynamic_cast<ConcreteColleagueA*>(pColleague);
        if (NULL == pTemp)
        {
            cout<<"The message is from ConcreteColleagueA. Now mediator forward it to ConcreteColleagueB"<<endl;
            if (m_pConcreteColleagueB != NULL)
            {
                pTemp->Notify("[ConcreteColleagueB]ConcreteMediator::Send->Notify");
            }
        }
        else
        {
            if (m_pConcreteColleagueA != NULL)
            {
                pTemp->Notify("[ConcreteColleagueA]ConcreteMediator::Send->Notify");
            }
        }
    }

    void ConcreteMediator::SetColleagueA(Colleague* pColleague)
    {
        m_pConcreteColleagueA = dynamic_cast<ConcreteColleagueA*>(pColleague);
    }

    void ConcreteMediator::SetColleagueB(Colleague* pColleague)
    {
        m_pConcreteColleagueB = dynamic_cast<ConcreteColleagueB*>(pColleague);
    }

    //////////////////////////////////////////////////////////////////////////
    void MediatorPattern_Test()
    {
        // Create the mediator
        Mediator *pMediator = new ConcreteMediator();

        Colleague *pColleague1 = new ConcreteColleagueA(pMediator);
        Colleague *pColleague2 = new ConcreteColleagueB(pMediator);

        ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);
        pConcreteMediator->SetColleagueA(pColleague1);
        pConcreteMediator->SetColleagueB(pColleague2);

        char message[260] = "Where are you from?";
        pColleague1->Send(message);
    }
}


客户端
#include "MediatorPattern.h"

#include <iostream>
#include <sstream>
#include <string>
#include <list>
using namespace std;
using namespace VisitorPattern;

void main()
{
    MediatorPattern_Test();
}


运行结果
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式

    标题和描述均提到了"C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式",这明确指向了一个特定的设计模式——中介者模式(Mediator Pattern),并且是在C#语言环境下的应用。下面将详细阐述这一设计...

    设计模式_行为型_中介者模式.md

    中介者模式(Mediator)是一种行为型设计模式,其核心思想在于通过引入一个中介者对象来封装一系列对象间的交互关系。在软件工程中,这种模式主要用于减少类之间复杂的直接通信,从而降低系统间的耦合性,提高可维护...

    设计模式专题之(十七)中介者模式---设计模式中介者模式示例代码(python--c++)

    **中介者模式**是软件设计模式中的一种结构型模式,它的主要目的是降低多个对象之间的复杂交互,通过引入一个中介对象来统一这些交互。在实际应用中,当对象间的交互变得日益复杂,导致类与类之间的关系过于紧密时,...

    设计模式 - 中介者模式

    中介者模式是一种行为设计模式,它用于减少多个对象之间的复杂交互,将这些对象通过一个共同的对象——中介者联系起来,使得各对象之间不再直接引用,而是通过中介者进行通信。这种模式降低了对象间的耦合度,提高了...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    5. **中介者模式**:用一个中介对象来封装一系列对象间的交互,降低它们之间的耦合。 6. **观察者模式**:定义了一对多的依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。 7. **备忘录...

    中介者模式逻辑关系

    中介者模式是一种设计模式,它的主要目的是降低对象之间的耦合度,使得对象之间的交互更加清晰。在实际的应用中,当多个对象需要频繁交互且关系复杂时,直接的相互依赖会导致系统结构变得难以理解和维护。中介者模式...

    C#面向对象设计模式纵横谈(17):(行为型模式) Mediator 中介者模式 (Level 300)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,其主要目的是降低多个对象之间的通信复杂性,将这些对象的直接交互转化为与一个中心对象——中介者的交互。在C#中,中介者模式的应用能够有效地减少类之间的...

    中介者模式demo

    中介者模式是一种设计模式,它在软件工程中用于降低多个对象之间的复杂交互。在iOS开发中,当多个视图控制器或其他组件之间存在复杂的...通过阅读和分析这些代码,开发者可以深入理解中介者模式在iOS开发中的具体应用。

    java设计模式之中介者模式

    首先,让我们通过一个实际的例子来理解中介者模式。假设你正在开发一个聊天应用,用户之间可以发送消息。如果每个用户对象都直接与其他用户对象通信,那么代码将变得复杂且难以管理。此时,我们可以引入一个“聊天室...

    设计模式 - 中介者模式(C++实例)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,它定义了一个用来封装一系列对象交互的接口。在软件工程中,当多个对象之间存在复杂的相互依赖关系时,这种模式可以帮助我们降低系统的耦合度,使得各个对象...

    设计模式-中介者模式(讲解及其实现代码)

    在众多设计模式中,中介者模式是一种行为设计模式,它的主要目的是降低对象之间的耦合性,使得对象之间的通信更加清晰和简洁。本文将深入讲解中介者模式,并提供具体的实现代码。 中介者模式的核心思想是引入一个...

    设计模式之中介者模式(Mediator Pattern)

    中介者模式是行为设计模式之一,其主要目的是降低多个对象之间的复杂性,通过引入一个中介对象来协调这些对象的交互。这种模式有助于减少对象之间的耦合,使得各个对象可以独立地进行修改和扩展。 **概念理解** 1....

    中介者模式 C++

    中介者模式是一种设计模式,属于行为模式类别,它在软件工程中扮演着重要的角色,尤其在处理对象之间的复杂交互时。这种模式的主要目的是减少对象之间的耦合度,通过引入一个中介对象来协调多个对象之间的通信,使得...

    中介者模式

    总结起来,中介者模式是一种有效的设计模式,它在多对象交互场景中起到桥梁和协调的作用,使系统更易于理解和维护。在外卖示例中,`DeliveryPlatform`作为一个中介者,使得顾客、餐厅和送餐员的交互变得更加有序和...

    中介者模式(mediator)

    **中介者模式(Mediator)**是一种设计模式,属于行为设计模式范畴,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在软件工程中,中介者模式常...

    设计模式之中介者模式(Mediator)

    在软件工程中,设计模式是一种被广泛采用的解决常见问题的经验总结,其中中介者模式是结构型设计模式的一种。它的主要目标是降低对象之间的耦合度,使得对象之间的关系更加清晰,同时也提高了代码的可维护性和可扩展...

    iOS的中介者设计模式

    **iOS的中介者设计模式** 中介者设计模式是一种行为设计模式,它主要用来减少对象之间的耦合,将多个对象间...通过理解和实践中介者模式,开发者能够更好地处理复杂的对象交互问题,创建出更加健壮和灵活的软件系统。

Global site tag (gtag.js) - Google Analytics