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 |