본문 바로가기

OOP/디자인 패턴

Decorator 패턴

1. 필요성

객체에 기능들을 필요에 따라 장착할 수 있도록 할 때 사용한다.

예를 들어 종스크롤 슈팅 게임을 보면 전투기가 아이템을 먹거나 레벨업을 할 때마다 공격시에 무기들이 추가되는 경우에 사용할 수 있다.

 

 

2. 전투기들 만들기

interface Fighter {
    fun attack()
}

class XWingFighter : Fighter {
    override fun attack() {
        Log.e("XWingFighter", "탄환 발사")
    }
}

 

 

3. 각 decorator를 만들기 위해 decorator 추상 클래스 생성

abstract class FighterDecorator(_fighter : Fighter) : Fighter {
    private var fighter : Fighter = _fighter

    override fun attack() {
        fighter.attack()
    }
}

 

 

4. decorator를 상속 받은 장착에 필요한 기능들 만들기

class LaserDecorator(_fighter : Fighter) : FighterDecorator(_fighter) {
    override fun attack() {
        super.attack()
        Log.e("LaserDecorator", "레이저 발사")
    }
}

class PlasmaDecorator(_fighter : Fighter) : FighterDecorator(_fighter){
    override fun attack() {
        super.attack()
        Log.e("PlasmaDecorator", "플라즈마 발사")
    }
}

부모 클래스의 attack() 호출하고 그 이후에 장착할 기능을 정의한다.

 

 

5. 생성자로 전투기를 넘겨주고 각 기능을 탑재해 사용한다

PlasmaDecorator(LaserDecorator(XWingFighter())).attack()

 

- 처리 순서

PlasmaDecorator에서 super.attack() 호출

LaserDecorator에서 super.attack() 호출

XWingFighter.attack() 호출

LaserDecorator 나머지 수행

PlasmaDecoratr 나머지 수행

'OOP > 디자인 패턴' 카테고리의 다른 글

abstract-factory method 패턴  (0) 2021.07.08
Factory 패턴  (0) 2021.07.07
Template 패턴  (0) 2021.07.03
Facade 패턴  (0) 2021.06.28
Proxy 패턴  (0) 2021.06.27