본문 바로가기
Programming/c++ Design Pattern

[C++ Design Pattern] Adapter

by 드가보자 2023. 11. 30.

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