본문 바로가기
Object-Oriented Programming/Design Pattern

Decorator Pattern, 데코레이터 패턴

by yongmin.Lee 2022. 7. 19.

Decorator Pattern

  • 정의 
    • 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우, 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계 하는 패턴
    • 상속(Inheritance)과 합성(Composition)을 사용하여 추가 기능의 조합을 동적으로 생성하여 추가할 수 있다
  • 패턴구조
    • Component
      • 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
      • 클라이언트는 Component를 통해 실제 객체를 사용함
    • ConcreteComponent
      • 기본 기능을 구현하는 클래스
    • Decorator
      • 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공
    • ConcreteDecoratorA, ConcreteDecoratorB
      • Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능

 

Decorator Pattern 적용 예시

1. 데코레이터 패턴 적용 전

데코레이터 적용 전

  • 위의 그림과 같은 상황의 런타임 단계에서 Sports Car의 특징과 Luxury Car의 특징을 모두 갖고 있는 Car 를 얻고 싶을때,  둘의 기능을 갖는 또다른 서브 클래스를 정의하는 것 대신 데코레이터 패턴을 적용할 수 있다
  • SportsCarDecorator 객체, LuxuryCarDecorator 객체를 정의하고 기능들을 조합할 수 있는 Decorator 객체를 정의한다.

 

2. Decorator 객체 정의

protocol Car {
	func assemble()
}

class BasicCar: Car {
 
	func assemble() {
		print("Basic Car.")
	}
}

class CarDecorator: Car {
 
	var car: Car
	
	init(car: Car) {
		self.car = car
	}
    
	func assemble() {
		self.car.assemble()
	}
}

class SportsCarDecorator: CarDecorator {
 
	override init(car: Car) {
		super.init(car: car)
	}
 
	override func assemble(){
		super.assemble()
		print(" Adding features of Sports Car.")
	}
}

class LuxuryCarDecorator: CarDecorator {

	override init(car: Car) {
		super.init(car: car)
	}
 
	override func assemble(){
		super.assemble()
		print(" Adding features of Luxury Car.")
	}
}
  • Component : protocol Car
  • ConcreteComponent : BasicCar
  • Decorator : CarDecorator
  • ConcreteDecorator : SportsCarDecorator, LuxuryCarDecorator

 

3. 필요한 Decorator 객체를 조합

class MainViewController : UIViewController {
	override func viewDidLoad() {
		var sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
		sportsLuxuryCar.assemble();
        // Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
    }
}

 

 

 

 

 

 

 

 

참고자료

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0_%ED%8C%A8%ED%84%B4

https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html

https://readystory.tistory.com/195?category=822867