본문 바로가기
디자인패턴

Adapter패턴.

by kcj3054 2022. 5. 23.

Adapter패턴?

  • 어댑터패턴은 말 그래도 콘센트 어댑터를 생각하면 편리하다 A와 B가 맞지 않지만 그것을 연결해주기 위해서 중간에 어댑터를 두는것과 같다..

STL과 Adapter 패턴..

  • Container Adapter는 컨테이너 인터페이스를 수정해서 stack, queue, pq를 제공한다..
list를 포함한다 포함을 이용한 방법..
template<typename T, typename Container = list<T>> 
class Stack
{
    Container st;
public:
    void push(const T& a) { st.push_back(a); }
    void pop() { st.pop_back(); }
    T& top() {    return st.back(); }
};
int main()
{
    Stack<int, vector<int> > s1;
    Stack<int> s2;

    return 0;
}
  • list를 포함해서 사용한다. 커스텀으로 구현된 Stack인데 list의 기능을 사용할 수가 없다 왜냐하면 list는 private으로 막혀있고, public의 기능은 진짜로 stack에서 필요한 부분만 list 것을 추출해서 사용 중이기때문이다..

  • 여기서 list의 기능을 수정해서 사용했기에 container adapter라고한다..

Adapter패턴 예 (도형편집기 사용..)

class TextView
{
    string data;
    string font;
    int        width;

public:
    TextView(string s, string fo = "나눔", int w = 24) : data(s), font(fo), width(w) {}
    void Show() { cout << data << endl; }
};


class Shape
{
public:
    virtual void Draw() { cout << "Draw Shape" << endl; }
};

class Text : public TextView, public Shape
{
public:
    Text(string s) : TextView(s) {}

    virtual void Draw() { TextView::Show(); }

};

//개체 어댑터 
class ObjectAdapter : public Shape
{
    TextView* pView;
public:
    ObjectAdapter(TextView* p) : pView(p) {}

    virtual void Draw() { pView->Show(); }
};

int main()
{  
    vector<Shape*> v;
    for (auto a : v)
        a->Draw();
    return 0;
}
  • 위의 예제에서 vector<Shape*> v;에 들어갈려면 기반 클래스가 Shape이어야한다.

  • 여기서 Text 클래스의 기능을 TextView에서 가지고 있는데 TextView만 상속받으면 vector<Shape*> v; 에 넣을 수가 없다...

  • 이 문제를 해결하기위해서 adapter패턴에는 포함을 사용하거나, 다중상속을 받는다...

  • 위의 Text클래스에서 TextView와 Shape 두가지 모두를 상속 받고있다.. 그러면서 Shape의 virtual을 구현하되 구현부에서 TextView::Show()를 사용하면된다.. 이부분이 adapter의 핵심이다..!! Text안에 TextView의 기능을 끼워넣었다..

어댑터의 종류

  • 개체 어답터

    • 객체의 인터페이스를 변경한다.
    • 구성을 사용하는 경우가 많다.
  • 클래스 어댑터

    • 클래스의 인터페이스를 변경한다.
    • 다중 상속 or 값으로 포함하는 경우가 많다.
    • 이미 존재하는 개체의 인터페이스는 변경할 수 없다..

'디자인패턴' 카테고리의 다른 글

옵저버 패턴  (0) 2023.09.24
builder패턴(c++)  (0) 2022.05.13
composite패턴  (0) 2022.05.12
builder()패턴  (0) 2021.10.04