Adapter 패턴

Adaper 패턴

  • 인터페이스를 제공함으로써 호환되지 않는 원본 인터페이스를 이용할 수 있게 함
  • 라이브러리의 업데이트 및 교체에 유연하게 대처할 수 있음
// 기존의 라이브러리
class Object { virtual void Draw() = 0;}
class Circle : public Object {
  void Draw() override { /*Draw Circle*/ }
}

// 새롭게 추가된 함수(또는 라이브러리)
class TextBox {
  void ViewText() {/*텍스트 상자 생성*/}
}

// 그래서 수정한 기존 함수...
void Display(Object* obj, TextBox* tb)
{
  if (obj) obj->Draw();
  else if (tb) tb->ViewText();
}
  • 위의 방법은 obj를 사용하는 부분에 일일이 수정을 해야 함
  • 그래서 아래와 같이 수정

Object Patern

// 기존의 라이브러리
class Object { 
  public:
    virtual void Draw() = 0;
  }

class Circle : public Object {
  public:
  void Draw() override { /*Draw Circle*/ }
}

// 새롭게 추가된 함수(또는 라이브러리)
class TextBox {
  public:
    void ViewText() {/*텍스트 상자 생성*/}
}

// 새로 만든 클래스 TextObject
class TextObject : public Object
{
    // TextBox를 객체로 받아서 사용
    TextBox* pObj = nullptr;
  public:
    TextObject() {pObj = new TextBox;}
    void Draw() { pObj->ViewText(); }
}
  • 새로운 클래스를 만들고, 거기서 필요한 객체를 생성해 사용

Class Pattern

class TextObject : public Object, private TextBox
{
  public:
    // 필요한 함수를 다른 이름으로 Wrapping
    void Draw() { ViewText(); }
}

// 기존 함수 사용 가능
void Display(Object* obj)
{
  if (obj) obj->Draw();
}
  • 새로운 클래스를 만들고, 거기에 상속을 받아 사용

출처