디자인패턴 1. 전략패턴

jiffydev·2022년 7월 22일
0

디자인패턴

목록 보기
1/1

코드를 Typescript로 작성하면서 틀린 부분이 있을 수 있습니다. 댓글 남겨주시면 수정하도록 하겠습니다.

내맘대로 요약

클라이언트 클래스의 행동 집합을 캡슐화하여(알고리즘군) 인터페이스로 추상화한다.
그리고 구체적인 행동을 각각 구현한다.(여기서는 클래스로 구현)
클라이언트가 상속받는 추상 클래스에서는 구체적인 행동에 대한 함수를 정의하는 대신, 행동의 인터페이스를 구현하도록하고 실질적인 행동은 위에서 구현한 구체적인 행동 클래스에 위임한다.

코드

요구사항

캐릭터와 캐릭터가 사용하는 무기가 있고, 캐릭터는 한 번에 하나의 무기만 사용할 수 있지만 무기를 바꿀 수 있다.

// 행동의 집합인 인터페이스
interface WeaponBehavior {
    useWeapon(): void
}

// 위 인터페이스를 구현하는 구체적인 행동 클래스들
class KnifeBehavior implements WeaponBehavior {
    useWeapon(){
        console.log('using knife')
    }
}

class BowAndArrowBehavior implements WeaponBehavior {
    useWeapon(){
        console.log('using BowAndArrow')
    }
}
class AxeBehavior implements WeaponBehavior {
    useWeapon(){
        console.log('using Axe')
    }
}
class SwordBehavior implements WeaponBehavior {
    useWeapon(){
        console.log('using Sword')
    }
}

// 캐릭터가 상속할 추상클래스
abstract class Character {
    weaponBehavior!: WeaponBehavior

    abstract fight(): void

    public setWeaponBehavior(wb:WeaponBehavior){
        this.weaponBehavior=wb
    }
}

class Knight extends Character {
    weaponBehavior = new SwordBehavior() // 기본값은 Sword를 사용하나 변경할 수 있다.

    public fight(){
        this.weaponBehavior.useWeapon()
    }
}

const knight = new Knight()
knight.fight() // 'using Sword'
knight.setWeaponBehavior(new AxeBehavior())
knight.fight() // 'using Axe'

결론

구체적인 행동을 클래스에서 메소드를 정의하지 않고 다른 클래스에 위임함으로써, 유연성을 높이고 상속의 단점을 제거할 수 있다.

profile
잘 & 열심히 살고싶은 개발자

0개의 댓글