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 |