๋ฐ์ฝ๋ ์ดํฐ ํจํด (Decorator Pattern)
๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด ์ค ํ๋๋ก, ๊ฐ์ฒด์ ๋์ ์ผ๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํจํด์ ๊ธฐ์กด์ ํด๋์ค๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ์ฑ ์์ ๋ถ์ฌํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์์ ๋์ ์กฐํฉ(composition)์ ํตํด ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ฉฐ, ์ด๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๊ฐ๋ฐฉ-ํ์ ์์น(Open-Closed Principle)์ ์ค์ํ๋ ๋ํ์ ์ธ ์์ ๋๋ค.
1. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ธฐ๋ณธ ๊ฐ๋
- ๊ตฌ์ฑ ์์:
- ์ปดํฌ๋ํธ(Component): ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ ์ถ์ ํด๋์ค์ด๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ค์ด ์ด๋ฅผ ๊ตฌํํฉ๋๋ค.
- ์ฝํฌ๋ฆฌํธ ์ปดํฌ๋ํธ(Concrete Component): ์ค์ ๊ธฐ๋ฅ์ ๊ตฌํํ ํด๋์ค์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ์ ์ํด ์ฅ์๋ ๊ฐ์ฒด์ ๋๋ค.
- ๋ฐ์ฝ๋ ์ดํฐ(Decorator): Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ฉฐ, Concrete Component ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค.
- ์ฝํฌ๋ฆฌํธ ๋ฐ์ฝ๋ ์ดํฐ(Concrete Decorator): ๋ฐ์ฝ๋ ์ดํฐ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ก, ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ด๋ฅผ ์๋ ๊ฐ์ฒด์ ์์ํฉ๋๋ค.
- ์ฅ์ :
- ๋ฐํ์์ ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์์์ ๋จ๋ฐํ์ง ์์ผ๋ฉด์๋ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ต๋๋ค.
- ํด๋์ค ๊ณ์ธต์ ๋ณต์ก์ฑ์ ์ค์ฌ์ค๋๋ค.
- ๋จ์ :
- ๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์ค์ฒฉ๋๋ฉด ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ ์ ์์ต๋๋ค.
- ๊ฐ์ฒด์ ๊ตฌ์ฑ(decorator chain)์ด ๋ณต์กํด์ง๋ฉด, ๋๋ฒ๊น ์ด ์ด๋ ค์์ง ์ ์์ต๋๋ค.
2. ๋ฐ์ฝ๋ ์ดํฐ ํจํด ์์
์๋ ์์ ์์๋ ์ปคํผ๋ฅผ ๋ง๋๋ ์์คํ ์์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ธ ์ปคํผ(ConcreteComponent)์ ์ถ๊ฐ์ ์ธ ์ฌ๋ฃ(์: ์ฐ์ , ์คํ ๋ฑ)๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ๊ตฌํํฉ๋๋ค.(C++)
#include <iostream>
#include <memory>
#include <string>
// Component
class Coffee {
public:
virtual std::string getDescription() const = 0;
virtual double cost() const = 0;
virtual ~Coffee() = default;
};
// ConcreteComponent
class SimpleCoffee : public Coffee {
public:
std::string getDescription() const override {
return "Simple Coffee";
}
double cost() const override {
return 2.0;
}
};
// Decorator
class CoffeeDecorator : public Coffee {
protected:
std::unique_ptr<Coffee> decoratedCoffee;
public:
CoffeeDecorator(std::unique_ptr<Coffee> coffee) : decoratedCoffee(std::move(coffee)) {}
std::string getDescription() const override {
return decoratedCoffee->getDescription();
}
double cost() const override {
return decoratedCoffee->cost();
}
};
// ConcreteDecorator
class MilkDecorator : public CoffeeDecorator {
public:
MilkDecorator(std::unique_ptr<Coffee> coffee) : CoffeeDecorator(std::move(coffee)) {}
std::string getDescription() const override {
return decoratedCoffee->getDescription() + ", Milk";
}
double cost() const override {
return decoratedCoffee->cost() + 0.5;
}
};
// ConcreteDecorator
class SugarDecorator : public CoffeeDecorator {
public:
SugarDecorator(std::unique_ptr<Coffee> coffee) : CoffeeDecorator(std::move(coffee)) {}
std::string getDescription() const override {
return decoratedCoffee->getDescription() + ", Sugar";
}
double cost() const override {
return decoratedCoffee->cost() + 0.3;
}
};
int main() {
// ๊ธฐ๋ณธ ์ปคํผ ์์ฑ
std::unique_ptr<Coffee> myCoffee = std::make_unique<SimpleCoffee>();
std::cout << myCoffee->getDescription() << " $" << myCoffee->cost() << std::endl;
// ์ฐ์ ์ถ๊ฐ
myCoffee = std::make_unique<MilkDecorator>(std::move(myCoffee));
std::cout << myCoffee->getDescription() << " $" << myCoffee->cost() << std::endl;
// ์คํ ์ถ๊ฐ
myCoffee = std::make_unique<SugarDecorator>(std::move(myCoffee));
std::cout << myCoffee->getDescription() << " $" << myCoffee->cost() << std::endl;
// ํ๋ฒ์ ๋ชจ๋ ์์ฑ
std::unique_ptr<Coffee> myCoffee2 =
std::make_unique<SugarDecorator>(
std::make_unique<MilkDecorator>(
std::make_unique<SimpleCoffee>()));
std::cout << myCoffee2->getDescription() << " $" << myCoffee2->cost() << std::endl;
return 0;
}
Simple Coffee $2
Simple Coffee, Milk $2.5
Simple Coffee, Milk, Sugar $2.8
Simple Coffee, Milk, Sugar $2.8
3. ์ฝ๋ ์ค๋ช
- Component: Coffee ์ธํฐํ์ด์ค๋ ์ปคํผ์ getDescription๊ณผ cost ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
- ConcreteComponent: SimpleCoffee ํด๋์ค๋ ๊ธฐ๋ณธ ์ปคํผ์ ์ค๋ช ๊ณผ ๊ฐ๊ฒฉ์ ์ ๊ณตํฉ๋๋ค.
- Decorator: CoffeeDecorator ํด๋์ค๋ Coffee๋ฅผ ์์๋ฐ์ ์ปคํผ๋ฅผ ์ฅ์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด ํด๋์ค๋ ๊ตฌ์ฑ๋ ์ปคํผ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋ฐ์ฝ๋ ์ดํฐ ํด๋์ค๋ ์ด ๊ฐ์ฒด์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ง๋ถ์ ๋๋ค.
- ConcreteDecorator: MilkDecorator์ SugarDecorator๋ CoffeeDecorator๋ฅผ ์์๋ฐ์ ์ฐ์ ์ ์คํ์ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค.
์ด ์์ ์์ ์ปคํผ์ ์ฐ์ ์ ์คํ์ ์ถ๊ฐํ๋ฉด์๋, ์๋์ SimpleCoffee ํด๋์ค๋ ์์ ํ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์์ต๋๋ค. ์ด์ฒ๋ผ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ํจํด์ ๋๋ค.
'๋์์ธํจํด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์์ธํจํด] ์ปดํฌ์งํธ(Composite) ํจํด (0) | 2024.08.25 |
---|---|
[๋์์ธํจํด] ์ ๋ต(Strategy) ํจํด (0) | 2024.08.24 |
์ถ์ ์ฑ๊ธํค ํจํด(Abstract Singleton) (0) | 2023.03.20 |
์ฑ๊ธํค ํจํด (1) | 2023.01.03 |
๋๊ธ