[Structural Pattern] Understanding of Adapter Pattern




head File
//AdapterPattern.h

#ifndef ADAPTER_PATTERN_H
#define ADAPTER_PATTERN_H

#include <Windows.h>

namespace AdapterPattern
{
    class Adaptee
    {
    public:
        Adaptee();
        ~Adaptee();
        void SpecificRequest();
    };

    // Base Class
    //////////////////////////////////////////////////////////////////////////
    class Adapter
    {
    public:
        Adapter();
        virtual ~Adapter();
        virtual void Request() = 0;
    };

    class ConcreteAdapterA : public Adapter
    {
    public:
        ConcreteAdapterA();
        virtual ~ConcreteAdapterA();
        virtual void Request();

    private:
        Adaptee* m_pAdaptee;
    };

    class ConcreteAdapterB : public Adapter, Adaptee
    {
    public:
        ConcreteAdapterB();
        virtual ~ConcreteAdapterB();
        virtual void Request();
    };

    //////////////////////////////////////////////////////////////////////////
    void AdapterPattern_Test_Object();
    void AdapterPattern_Test_Class();
}

#endif

accomplish
#include "AdapterPattern.h"
#include <iostream>
using namespace std;

namespace AdapterPattern
{
    //////////////////////////////////////////////////////////////////////////
    Adaptee::Adaptee()
    {
    }
    Adaptee::~Adaptee()
    {
    }
    void Adaptee::SpecificRequest()
    {
        cout << "Adaptee::SpecificRequest()\n" ;
    }

    //////////////////////////////////////////////////////////////////////////
    Adapter::Adapter()
    {
    }
    Adapter::~Adapter()
    {
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteAdapterA::ConcreteAdapterA()
        : m_pAdaptee(new Adaptee)
    {
    }
    ConcreteAdapterA::~ConcreteAdapterA()
    {
        if (m_pAdaptee != NULL)
        {
            delete m_pAdaptee;
            m_pAdaptee = NULL;
        }
    }
    void ConcreteAdapterA::Request()
    {
        m_pAdaptee->SpecificRequest();
        cout << "ConcreteAdapterA::Request()\n" ;
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteAdapterB::ConcreteAdapterB()
    {
    }
    ConcreteAdapterB::~ConcreteAdapterB()
    {
    }
    void ConcreteAdapterB::Request()
    {
        Adaptee::SpecificRequest();
        cout << "ConcreteAdapterB::Request()\n" ;
    }

    //////////////////////////////////////////////////////////////////////////
    void AdapterPattern_Test_Object()
    {
        ConcreteAdapterA* pAdapter = new ConcreteAdapterA();

        pAdapter->Request();

        delete pAdapter;
        pAdapter = NULL;
    }

    void AdapterPattern_Test_Class()
    {
        ConcreteAdapterB* pAdapter = new ConcreteAdapterB();

        pAdapter->Request();

        delete pAdapter;
        pAdapter = NULL;
    }
}

client
#include "AdapterPattern.h"

#include <iostream>
using namespace AdapterPattern;

void main()
{
    AdapterPattern_Test_Object();
    AdapterPattern_Test_Class();
}

operation result

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326927842&siteId=291194637