2015년 12월 6일 일요일

Adapter Pattern (적응자 패턴, Wrapper)

의도
  • 서로 다른 클래스끼리 함께 동작할 수 있도록 인터페이스를 변환하는 패턴
이럴 때 사용하자.
  • 재사용하려고 하는 인터페이스가 맞지 않거나 수정할 수 없을 때
장점은?
  • 두개의 소스는 전혀 수정이 되지 않고 어댑터 클래스를 추가히여 두개의 사이를 연결해준다
단점은?
  • 하나의 클래스와 이 클래스의 모든 서브클래스들을 개조할 때에는 사용할 수 없다.
  • 적응자만 계속 늘려나가다보면 본래 인터페이스보다 커지는 경우가 발생한다.
코드
AndroidPhone 클래스 (adaptee)
class AndroidPhone
{
public:
   void Charge() { cout << "charging..." << endl; };
};

USB 클래스
class USB
{
public:
   virtual void Plug() = 0;
};

USBtoMicro5pinA 클래스 (object adapter type)
class USBtoMicro5pinA : public USB
{
public:
   USBtoMicro5pinA() { pAndroidPhone = new AndroidPhone(); };
   ~USBtoMicro5pinA() {
      if (pAndroidPhone)
         delete pAndroidPhone;
      pAndroidPhone = NULL;
   };
   virtual void Plug() {
      cout << "A Type :";
      pAndroidPhone->Charge();
   };
private:
   AndroidPhone* pAndroidPhone;
};

USBtoMicro5pinB 클래스 (class adapter type)
class USBtoMicro5pinB : public USB, public AndroidPhone
{
public:
   virtual void Plug() {
      cout << "B Type :";
      Charge();
   };
};

실행 부분
void main()
{
   // object adapter
   auto_ptr<USB> pUSBtoMicro5pinA(new USBtoMicro5pinA());
   pUSBtoMicro5pinA->Plug();
   
   // class adapter
   auto_ptr<USB> pUSBtoMicro5pinB(new USBtoMicro5pinB());
   pUSBtoMicro5pinB->Plug();
}

UML - class 다이어그램
object adapter
class adapter
참고
  • GoF의 디자인 패턴(개정판) 재사용성을 지닌 객체지향 소프트웨어의 핵심요소
  • http://blog.naver.com/jak500/220334322118
  • http://blog.naver.com/ktmgame/20204622582

댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.