[ Adapter Pattern의 정의 ]
한 글래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
[ 클래스 다이어그램 ]

[ 시나리오 ]
오리와 칠면조 클래스가 있다. 칠면조를 오리로 둔갑 시켜야 한다. 그러나 이 두 클래스는 서로의 인터패이스가 틀리다는 문제가 있다.
[ 요약 ]
오리 클래스를 상속받고 칠면조 클래스는 레어링 시킨다. 그리고 오리 클래스 인터페이스에 맞쳐서 연결 시키면 된다.
[ 구현코드 ]
[ 결과화면 ]

[References]
Head First Design Patterns / 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠
GoF 디자인 패턴! 이렇게 활용한다 / 장세찬
한 글래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
[ 클래스 다이어그램 ]

[ 시나리오 ]
오리와 칠면조 클래스가 있다. 칠면조를 오리로 둔갑 시켜야 한다. 그러나 이 두 클래스는 서로의 인터패이스가 틀리다는 문제가 있다.
[ 요약 ]
오리 클래스를 상속받고 칠면조 클래스는 레어링 시킨다. 그리고 오리 클래스 인터페이스에 맞쳐서 연결 시키면 된다.
[ 구현코드 ]
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Duck
{
public:
virtual void Fly( void ) = 0;
virtual void Quack( void ) = 0;
};
class MallardDuck : public Duck
{
public:
virtual void Fly( void ) { cout<<"청둥오리인 저는 날고 있어요~"; }
virtual void Quack( void ) { cout<<" 꽥"<<endl<<endl; }
};
class Turkey
{
public:
virtual void Fly( void ) = 0;
virtual void Gobble( void ) = 0;
};
class WildTurkey : public Turkey
{
public:
virtual void Fly( void ) { cout<<"칠면조인 저는 조금밖에 못날아요~"; }
virtual void Gobble( void ) { cout<<" 골골"<<endl<<endl; }
};
class TurkeyAdapter : public Duck
{
public:
TurkeyAdapter( Turkey* pTurkey ) { m_pTurkey = pTurkey; }
public:
virtual void Fly( void )
{
cout<<"오리로 둔갑했지만 사실은 칠면조에요~ ";
m_pTurkey->Fly();
}
virtual void Quack( void ) { m_pTurkey->Gobble(); }
private:
Turkey* m_pTurkey;
};
int _tmain(int argc, _TCHAR* argv[])
{
Duck* pMallardDuck = new MallardDuck;
pMallardDuck->Fly();
pMallardDuck->Quack();
Turkey* pWildTurkey = new WildTurkey;
pWildTurkey->Fly();
pWildTurkey->Gobble();
TurkeyAdapter* pTurkeyAdapter = new TurkeyAdapter( pWildTurkey );
pTurkeyAdapter->Fly();
pTurkeyAdapter->Quack();
}
#include <iostream>
#include <string>
using namespace std;
class Duck
{
public:
virtual void Fly( void ) = 0;
virtual void Quack( void ) = 0;
};
class MallardDuck : public Duck
{
public:
virtual void Fly( void ) { cout<<"청둥오리인 저는 날고 있어요~"; }
virtual void Quack( void ) { cout<<" 꽥"<<endl<<endl; }
};
class Turkey
{
public:
virtual void Fly( void ) = 0;
virtual void Gobble( void ) = 0;
};
class WildTurkey : public Turkey
{
public:
virtual void Fly( void ) { cout<<"칠면조인 저는 조금밖에 못날아요~"; }
virtual void Gobble( void ) { cout<<" 골골"<<endl<<endl; }
};
class TurkeyAdapter : public Duck
{
public:
TurkeyAdapter( Turkey* pTurkey ) { m_pTurkey = pTurkey; }
public:
virtual void Fly( void )
{
cout<<"오리로 둔갑했지만 사실은 칠면조에요~ ";
m_pTurkey->Fly();
}
virtual void Quack( void ) { m_pTurkey->Gobble(); }
private:
Turkey* m_pTurkey;
};
int _tmain(int argc, _TCHAR* argv[])
{
Duck* pMallardDuck = new MallardDuck;
pMallardDuck->Fly();
pMallardDuck->Quack();
Turkey* pWildTurkey = new WildTurkey;
pWildTurkey->Fly();
pWildTurkey->Gobble();
TurkeyAdapter* pTurkeyAdapter = new TurkeyAdapter( pWildTurkey );
pTurkeyAdapter->Fly();
pTurkeyAdapter->Quack();
}
[ 결과화면 ]
[References]
Head First Design Patterns / 에릭 프리먼, 엘리자베스 프리먼, 케이시 시에라, 버트 베이츠
GoF 디자인 패턴! 이렇게 활용한다 / 장세찬





덧글