프로그래밍/GoF

[구조 패턴] - 어댑터(Adapter)

MAKGA 2022. 1. 10. 22:46
320x100

구조

#pragma once

#include <iostream>

class IAdapter
{
public:
    virtual void OperateAdapter() = 0;
};

class Adaptee
{
public:
    void OperateAdaptee()
    {
        std::cout << "Operate Adaptee" << std::endl;
    }
};

class ReferenceAdapter : public IAdapter
{
public:
    ReferenceAdapter(Adaptee adaptee)
    {
        adaptee_ = adaptee;
    }

    void OperateAdapter() override
    {
        adaptee_.OperateAdaptee();
    }

private:
    Adaptee adaptee_;
};

class ImplementationAdapter : public Adaptee, public IAdapter
{
public:
    void OperateAdapter() override
    {
        OperateAdaptee();
    }
};

 

사용

int main()
{
    IAdapter* adapter = new ReferenceAdapter(Adaptee());
    adapter->OperateAdapter();

    adapter = new ImplementationAdapter();
    adapter->OperateAdapter();

    return 0;
}

 

클래스에 인터페이스를 직접 구현하는것도 방법이지만, 그것은 SOLID의 개방-폐쇄의 원칙에 어긋나기도 하고 라이브러리를 사용하는 경우 수정이 불가능하기도 하다.

클래스(Adaptee)와 인터페이스(IAdapter) 사이에 어댑터의 개념을 가진 클래스(ImplementationAdapter)를 만들어 클라이언트에게 클래스에 대한 인터페이스를 제공한다. 클라이언트는 클래스와 연결된 어댑터를 인터페이스로써 활용할 수 있다. 그러므로, 어댑터 패턴을 이용하여 클래스에 대한 다양한 인터페이스와의 의존성을 분리할 수 있다.

320x100