데코레이터 패턴(Decorator Pattern)
객체에 동적으로 새로운 기능을 추가하려고 할 때 사용한다. 이 과정에서 객체의 타입과 호출하는 메소드는 그대로 유지한다. 또한, 상속을 통해 하위 클래스를 만드는 방법이 비효율적인 상황에서 사용할 수 있다.
예제. 고전 전투기 게임
위와 같은 전투기 게임에서 아이템을 먹을 때 마다 새로운 무기가 추가되는 기능이 존재한다.
기본 구성
interface Fighter{
fun attack()
}
open class F22Fighter:Fighter{
override fun attack(){
print("발사")
}
}
데코레이터 패턴
위의 F22Fighter 전투에서 아이템을 먹을 때 마다 추가될 기능을 구현한다.
interface FighterDecorator(
private val decoratedFighter : Fighter
): Fighter{
fun attack(){
decoratedFighter.attack()
}
}
class LaserDecorater : FighterDecorator{
constructor(decoratedFighter : Fighter) : super(decoratedFighter)
override fun attack(){
super.attack()
print("레이저 발사")
}
}
class PlasmaDecorater : FighterDecorator{
constructor(decoratedFighter : Fighter) : super(decoratedFighter)
override fun attack(){
super.attack()
print("플라즈마 발사")
}
}
활용
fun main(){
F22Fighter().attack()
//발사
LaserDecorator(F22Fighter()).attack()
//발사
//레이저 발사
PlasmaDecorator(
LaserDecorator(
F22Fighter()
)
).attack()
//발사
//레이저 발사
//플라즈마 발사
}
요약
- 새로운 기능을 객체에 동적으로 추가하려고 할 때 활용
- 기존 객체를 데코레이터 객체 내부에 선언하고 생성자로 기존 객체를 넘긴다.
'Domain > 디자인패턴' 카테고리의 다른 글
[디자인패턴] 널 오브젝트 패턴(Null Object Pattern) (0) | 2021.04.03 |
---|---|
[디자인패턴] 미디에이터 패턴(Mediator Pattern) (0) | 2021.04.03 |
[디자인패턴] 프록시 패턴(Proxy Pattern) (0) | 2021.04.01 |
[디자인패턴] 퍼사드 패턴(Facade Pattern) (0) | 2021.03.30 |
[디자인패턴] 템플릿 메소드 패턴(Template Method Pattern) (0) | 2021.03.30 |