-
반응형
전략패턴은 객체의 행동 전략이 변한다는 디자인원칙을 기반으로 한다.
1. UML
아래는 전략 패턴의 UML이다.
영웅(Hero) 객체의 하위에는 리퍼(Reaper), 애쉬(Ashe), 라인하르트(Reinhardt), 아나(Ana)가 있다. 처음, 라인하르트는 망치를 휘두르며 공격하고, 리퍼, 애쉬, 아나는 총으로 공격한다고 정의한다. 영웅 객체는 주입받은 행동에 따라 공격 방식을 바꾼다. 라인하르트에 HammerAction 객체를 GunAction으로 변경하면 총으로 공격하도록 변경할 수도 있다.
2. 코드
영웅에 대한 캐릭터 생성을 해준다.
abstract class Hero { protected lateinit var weaponAction: WeaponAction fun setAction(weaponAction: WeaponAction) { this.weaponAction = weaponAction } open fun attack() {} }
class Ana : Hero() { override fun attack() { print("Ana ") weaponAction.useWeapon() } }
class Ashe: Hero() { override fun attack() { print("Ashe ") weaponAction.useWeapon() } }
class Reaper: Hero() { override fun attack() { print("Reaper ") weaponAction.useWeapon() } }
class Reinhardt: Hero() { override fun attack() { print("Reinhardt ") weaponAction.useWeapon() } }
무기별 동작을 생성해준다.
interface WeaponAction { fun useWeapon() }
class GunAction: WeaponAction { override fun useWeapon() { println("Shoot") } }
class HammerAction: WeaponAction { override fun useWeapon() { println("Smash") } }
다음은 실행 코드다.
fun main() { val gun = GunAction() val hammer = HammerAction() val ana = Ana().apply { this.setAction(gun) } val ashe = Ashe().apply { this.setAction(gun) } val reaper = Reaper().apply { this.setAction(gun) } val reinhardt = Reinhardt().apply { this.setAction(hammer) } ana.attack() ashe.attack() reaper.attack() reinhardt.attack() println("==============Ashe change weapon to hammer") ashe.setAction(hammer) ashe.attack() }
3. 실행 결과
반응형