[λ””μžμΈνŒ¨ν„΄] λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄

2024. 8. 23. 08:17Β·λ””μžμΈνŒ¨ν„΄

 


λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄ (Decorator Pattern)

λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ 객체 μ§€ν–₯ λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜λ‘œ, 객체에 λ™μ μœΌλ‘œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이 νŒ¨ν„΄μ€ 기쑴의 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ 객체에 좔가적인 μ±…μž„μ„ λΆ€μ—¬ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ 상속 λŒ€μ‹  μ‘°ν•©(composition)을 톡해 κΈ°λŠ₯을 ν™•μž₯ν•˜λŠ” 방법을 μ œμ‹œν•˜λ©°, μ΄λŠ” 객체 μ§€ν–₯ μ„€κ³„μ˜ 개방-폐쇄 원칙(Open-Closed Principle)을 μ€€μˆ˜ν•˜λŠ” λŒ€ν‘œμ μΈ μ˜ˆμž…λ‹ˆλ‹€.

1. λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ˜ κΈ°λ³Έ κ°œλ…

  • ꡬ성 μš”μ†Œ:
    1. μ»΄ν¬λ„ŒνŠΈ(Component): κΈ°λ³Έ μΈν„°νŽ˜μ΄μŠ€λ‚˜ 좔상 클래슀이며, ꡬ체적인 객체듀이 이λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.
    2. 콘크리트 μ»΄ν¬λ„ŒνŠΈ(Concrete Component): μ‹€μ œ κΈ°λŠ₯을 κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μž…λ‹ˆλ‹€. λ°μ½”λ ˆμ΄ν„°μ— μ˜ν•΄ μž₯식될 κ°μ²΄μž…λ‹ˆλ‹€.
    3. λ°μ½”λ ˆμ΄ν„°(Decorator): Component μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ©°, Concrete Component 객체λ₯Ό κ°μ‹Έμ„œ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•©λ‹ˆλ‹€.
    4. 콘크리트 λ°μ½”λ ˆμ΄ν„°(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. μ½”λ“œ μ„€λͺ…

  1. Component: Coffee μΈν„°νŽ˜μ΄μŠ€λŠ” μ»€ν”Όμ˜ getDescriptionκ³Ό cost λ©”μ„œλ“œλ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
  2. ConcreteComponent: SimpleCoffee ν΄λž˜μŠ€λŠ” κΈ°λ³Έ μ»€ν”Όμ˜ μ„€λͺ…κ³Ό 가격을 μ œκ³΅ν•©λ‹ˆλ‹€.
  3. Decorator: CoffeeDecorator ν΄λž˜μŠ€λŠ” Coffeeλ₯Ό 상속받아 컀피λ₯Ό μž₯μ‹ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” κ΅¬μ„±λœ 컀피 객체λ₯Ό κ°€μ§€κ³  있으며, λ°μ½”λ ˆμ΄ν„° ν΄λž˜μŠ€λŠ” 이 객체에 좔가적인 κΈ°λŠ₯을 λ§λΆ™μž…λ‹ˆλ‹€.
  4. ConcreteDecorator: MilkDecorator와 SugarDecoratorλŠ” CoffeeDecoratorλ₯Ό 상속받아 μš°μœ μ™€ 섀탕을 μΆ”κ°€ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.

이 μ˜ˆμ œμ—μ„œ 컀피에 μš°μœ μ™€ 섀탕을 μΆ”κ°€ν•˜λ©΄μ„œλ„, μ›λž˜μ˜ SimpleCoffee ν΄λž˜μŠ€λŠ” μˆ˜μ •ν•˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이처럼 λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄μ€ 객체에 κΈ°λŠ₯을 λ™μ μœΌλ‘œ μΆ”κ°€ν•˜λŠ” 데 맀우 μœ μš©ν•œ νŒ¨ν„΄μž…λ‹ˆλ‹€.

 

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)

'λ””μžμΈνŒ¨ν„΄' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ””μžμΈνŒ¨ν„΄] μ»΄ν¬μ§€νŠΈ(Composite) νŒ¨ν„΄  (1) 2024.08.25
[λ””μžμΈνŒ¨ν„΄] μ „λž΅(Strategy) νŒ¨ν„΄  (0) 2024.08.24
좔상 싱글톀 νŒ¨ν„΄(Abstract Singleton)  (3) 2023.03.20
싱글톀 νŒ¨ν„΄  (1) 2023.01.03
'λ””μžμΈνŒ¨ν„΄' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [λ””μžμΈνŒ¨ν„΄] μ»΄ν¬μ§€νŠΈ(Composite) νŒ¨ν„΄
  • [λ””μžμΈνŒ¨ν„΄] μ „λž΅(Strategy) νŒ¨ν„΄
  • 좔상 싱글톀 νŒ¨ν„΄(Abstract Singleton)
  • 싱글톀 νŒ¨ν„΄
μ„œμ•„λž‘πŸ˜ƒ
μ„œμ•„λž‘πŸ˜ƒ
Just Do ItπŸ’ͺ
  • μ„œμ•„λž‘πŸ˜ƒ
    G-Stack
    μ„œμ•„λž‘πŸ˜ƒ
  • 전체
    였늘
    μ–΄μ œ
    • 전체보기 (144)
      • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ (78)
        • C++ 기초 (28)
        • C++ μ‘μš© (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • 컴퓨터 ꡬ쑰 & 운영체제 (31)
      • μ•Œκ³ λ¦¬μ¦˜ (12)
      • λ°μ΄ν„°λ² μ΄μŠ€ (5)
      • λ„€νŠΈμ›Œν¬ (3)
      • λ””μžμΈνŒ¨ν„΄ (5)
      • μ„œλΉ„μŠ€ & 툴 (7)
      • νŠΈλ Œλ“œ&이슈 (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

    • GμŠ€νƒμ˜ 기술 λΈ”λ‘œκ·Έ
  • 인기 κΈ€

  • νƒœκ·Έ

    쑰건문
    λ°μ΄ν„°λ² μ΄μŠ€
    go
    상속
    컴퓨터
    가상메λͺ¨λ¦¬
    STD
    component
    λ³€μˆ˜
    c
    μŠ€νƒ
    RAM
    νŒŒμΌμž…μΆœλ ₯
    init
    ν•¨μˆ˜
    λ°°μ—΄
    Thread
    pointer
    fork
    c++
    νŒ¨ν‚€μ§€
    μ•Œκ³ λ¦¬μ¦˜
    λ©”λͺ¨λ¦¬
    포인터
    ν•˜λ“œλ””μŠ€ν¬
    λ””μžμΈνŒ¨ν„΄
    μž¬κ·€
    반볡문
    파이썬
    cpu
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.6
μ„œμ•„λž‘πŸ˜ƒ
[λ””μžμΈνŒ¨ν„΄] λ°μ½”λ ˆμ΄ν„° νŒ¨ν„΄
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”