Adapter는 사실 중간자 역할을 해주는 간접층을 하나 생성하는 것이라고 생각하면 된다.
#include <iostream> #include <string> #include <vector> class TextView { std::string data; public: TextView(const std::string& s) : data(s) {} void show() { std::cout << data << std::endl; } }; //=========================================================== class Shape { public: virtual void draw() = 0; virtual ~Shape() {} }; class Rect : public Shape { public: void draw() override { std::cout << "draw rect" << std::endl; } }; class Circle : public Shape { public: void draw() override { std::cout << "draw circle" << std::endl; } }; class Text : public Shape, public TextView { public: Text(const std::string& s) : TextView(s) {} void draw() { TextView::show(); } }; class ObjectAdapter : public Shape { TextView* view; public: ObjectAdapter(TextView* view) : view(view) {} void draw() override { view->show(); } }; int main() { std::vector<Shape*> v; TextView tv("hello"); v.push_back(new ObjectAdapter( &tv ) ); v[0]->draw(); }
TextView 함수랑 도형 편집기에서 사용한 Shape를 같이 어떻게 사용하고 싶다.
=> 두 개의 공통 기반 class 를 만든다고 생각해보면, 멤버 함수의 이름이 달라서 방법이 없다.
Text는 Interface Shape에게도 추가 상속을 받아서, Draw()라는 표현을 잠시 빌리는 느낌이다. 실제 구현은 Show() 함수이지만 draw하는 것 처럼 착각을 하게 하는 ?? 그런 느낌
Shape에 있는 draw() 함수를 동일하게 사용하기 위해서 간접층인 Text를 만든 셈입니다.
그 다음은 객체 Adapter인데

draw() 함수를 사용하고 싶은 Textview class 객체를 멤버 변수로 두고, Shape에게 상속 받아서
draw() 함수를 정의 할 수 있게 합니다. 그리고 실제 구현은 TextView의 show함수를 넣는 것입니다.
TextView TV("Yaho~")
p = newObjectAdapter(&TV)
p->draw() 함수를 부르면 사실은 show() 함수가 호출되는 것이다.
'Programming > c++ Design Pattern' 카테고리의 다른 글
[C++ Design patter] Factory. (1) | 2023.11.30 |
---|---|
[C++ Design Pattern] Flyweight (1) | 2023.11.30 |
[C++ Design Pattern] Decorator (0) | 2023.11.29 |
[C++ Design Pattern] Composite (1) | 2023.11.29 |
[C++ Design Pattern] Strategy Pattern (0) | 2023.11.29 |