본문 바로가기

Domain/디자인패턴

[디자인패턴] 데코레이터 패턴(Decorator Pattern)

데코레이터 패턴(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()
    //발사
    //레이저 발사
    //플라즈마 발사
}

 

 

요약

  • 새로운 기능을 객체에 동적으로 추가하려고 할 때 활용
  • 기존 객체를 데코레이터 객체 내부에 선언하고 생성자로 기존 객체를 넘긴다.