====== Adapter 패턴 ======
===== 타입 =====
Structural Pattern
===== 문제 =====
기존에 개발되어 있는 모듈을 우리 시스템에서 사용하려 했더니 인터페이스가 달라 사용하기 힘들다.
===== 해결 =====
* 다중 상속을 이용한다. (클래스 어댑터)
* 클래스 내부에 기존에 개발되어 있는 모듈을 위한 객체를 멤버 변수로 선언한다. (객체 어댑터)
===== 클래스 다이어그램 =====
{{:programming:design_pattern:adapter.png|}}
===== 예제 =====
#include
using namespace std;
struct POINT
{
int x,y;
};
// 도형
class CShape
{
public:
virtual void GetShapeInfo(POINT& ptTopLeft, POINT& ptBottomRight) {}
};
// 사각형 보기
class CRectView
{
public:
void GetOrigin(int x, int y)
{
cout << x << " " << y << endl;
}
void GetSize(int nWidth, int nHeight)
{
cout << nWidth << " " << nHeight << endl;
}
};
// 사각형
class CRectangle : public CShape, public CRectView
{
public:
virtual void GetShapeInfo(POINT& ptTopLeft, POINT& ptBottomRight)
{
GetOrigin(ptTopLeft.x, ptTopLeft.y);
GetSize(ptBottomRight.x - ptTopLeft.x, ptBottomRight.y - ptTopLeft.y);
}
};
int main(void)
{
CShape* rect = new CRectangle;
POINT pt1 = {3, 4};
POINT pt2 = {7, 8};
rect->GetShapeInfo(pt1, pt2);
delete rect;
return 0;
}
class CRectangle : public CShape
{
private:
CRectView pView;
public:
virtual void GetShapeInfo(POINT& ptTopLeft, POINT& ptBottomRight)
{
pView.GetOrigin(ptTopLeft.x, ptTopLeft.y);
pView.GetSize(ptBottomRight.x - ptTopLeft.x, ptBottomRight.y - ptTopLeft.y);
}
};
나머지 부분은 클래스 어댑터와 동일
===== 참고 =====
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns#Adapter \\
http://showmiso.tistory.com/120