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
'프로그래밍 > GoF' 카테고리의 다른 글
[구조 패턴] - 컴포지트(Composite) (0) | 2022.01.11 |
---|---|
[구조 패턴] - 브릿지(Bridge) (0) | 2022.01.10 |
[행동 패턴] - 템플릿 메서드(Template method) (0) | 2022.01.09 |
[행동 패턴] - 방문자(Visitor) (0) | 2022.01.09 |
[행동 패턴] - 전략(Strategy) (0) | 2022.01.08 |