Decorator Pattern
- 정의
- 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우, 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계 하는 패턴
- 상속(Inheritance)과 합성(Composition)을 사용하여 추가 기능의 조합을 동적으로 생성하여 추가할 수 있다
- 패턴구조
- Component
- 기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의
- 클라이언트는 Component를 통해 실제 객체를 사용함
- ConcreteComponent
- 기본 기능을 구현하는 클래스
- Decorator
- 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공
- ConcreteDecoratorA, ConcreteDecoratorB
- Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능
- Component
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
'Object-Oriented Programming > Design Pattern' 카테고리의 다른 글
Adapter Pattern, 어댑터 패턴 (0) | 2022.07.29 |
---|---|
Composite Pattern, 컴포지트 패턴 (0) | 2022.07.28 |
Proxy pattern, 프록시패턴 (0) | 2022.07.19 |
Template method pattern, 템플릿 메소드 패턴 (0) | 2022.05.16 |
Abstract Factory Pattern, 추상 팩토리 패턴 (0) | 2022.05.11 |