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

[C++ Design Pattern] Decorator

by 드가보자 2023. 11. 29.

 

Decorator 패턴은 객체 지향 디자인 패턴 중 하나.

=> 기능을 동적으로 추가하거나 확장 할 수 있게 도와주는 패턴

 

상속을 사용해서 기능을 확장하고, 객체를 감싸서 포장 하는 느낌으로 기능을 추가할 수 있다. 

 

Decorator 패턴은 크게 3가지의 구성 요소로 나뉘는데

 

1. Component Class => Interface를 제공 

2. Concrete Component Class => 기능을 추가하고자 하는 객체

3. Decorator class => 기능을 추가시켜주는 class

 

Picture를 하나 찍을건데, picture에 frame도 씌우고 emoticon도 추가하고 싶다. 아래 코드를 보면

#include <iostream>
#include <string>

struct Component
{
	virtual void draw() = 0;
	virtual ~Component() {}
};

class Picture : public Component
{
	std::string url;
public:
	Picture(const std::string& url) : url(url) {}

	void draw() { std::cout << "draw " << url << std::endl; }
};

class Decorator : public Component
{
	Component* pic;
public:
	Decorator(Component* pic) : pic(pic) {}

	void draw() { pic->draw(); }
};

class DrawFrame : public Decorator
{	
public:
	DrawFrame(Component* pic) : Decorator(pic) {}

	void draw()
	{
		std::cout << "==================\n";
		Decorator::draw();
		std::cout << "==================\n";
	}
};

class DrawEmoticon : public Decorator
{	
public:
	DrawEmoticon(Component* pic) : Decorator(pic) {}

	void draw()
	{
		std::cout << "=======~*~=======\n";
		Decorator::draw();
		std::cout << "=======~*~========\n";
	}
};

int main()
{
	Picture pic("www.naver.com/a.png");
	pic.draw();

	DrawFrame frame(&pic);
	frame.draw();

	DrawEmoticon emoticon(&frame);
	emoticon.draw();
}

 

Picture가 여기서는 꾸밈을 받아야 하는 객체, Concrete Component class에 해당한다. 

여기서 Decorator class를 보면 꾸며줘야하는 사진(Component)의 포인터를 멤버 변수로 가지고 있다. 

그리고 Draw 부분에는 자기가 추가 하고 싶은 기능을 추가한 뒤에, 멤버 변수에 Draw 함수를 call한다. 

 

 

'Programming > c++ Design Pattern' 카테고리의 다른 글

[C++ Design Pattern] Flyweight  (1) 2023.11.30
[C++ Design Pattern] Adapter  (0) 2023.11.30
[C++ Design Pattern] Composite  (1) 2023.11.29
[C++ Design Pattern] Strategy Pattern  (0) 2023.11.29
[c++ Design Pattern] Template Method  (0) 2023.11.29