프런트엔드/디자인 패턴

[9일차] 전략 | 행동 패턴 11일만에 끝내기 챌린지 - GoF 디자인 패턴

조드래곤나인 2023. 7. 16. 15:10

 

출처: 에릭 감마 , 리처드 헬름 , 랄프 존슨 , 존 블리시디스. 『Gof의 디자인 패턴』. 김정아(역). 프로텍미디어, 2015.

 

 

[9일차] 전략(Strategy)
행동 패턴 11일만에 끝내기 챌린지 - GoF 디자인 패턴

타입스크립트로 설명하는 GoF 디자인 패턴의 행동 패턴 11일만에 끝내기 챌린지

 

 

전략이란?

동일 계열의 알고리즘군을 정의하고,
각각의 알고리즘을 캡슐화하여,
이들을 상호교환이 가능하도록 만드는 패턴이다.
알고리즘을 사용하는 사용자와 상관없이
독립적으로 알고리즘을 다양하게 변경할 수 있게 한다.

 

 

활용성

1) 하나의 클래스가 많은 행동을 정의하고,
이런 행동들이 그 클래스의 연산안에서 복잡한 다중 조건문의 모습을 취할 때

2) 행동들이 조금씩 다를 뿐 개념적으로 관련된 많은 클래스들이 존재할 때

3) 알고리즘의 변형이 필요할 때

4) 사용자가 몰라야 하는 데이터를 사용하는 알고리즘이 있을 때

 

 

구조 및 구현

interface Strategy {
    algorithmInterface(a: number, b: number): unknown
}

class Context {
    private strategy: Strategy

    constructor(strategy: Strategy) {
        this.strategy = strategy
    }

    changeStrategy(strategy: Strategy) {
        this.strategy = strategy
    }

    contextInterface() {
        console.log(this.strategy.algorithmInterface(5, 5))
    }
}

class ConcreteStrategyA implements Strategy {
    algorithmInterface(a: number, b: number) {
        return a * b
    }
}

class ConcreteStrategyB implements Strategy {
    algorithmInterface(a: number, b: number) {
        return a + b
    }
}

class ConcreteStrategyC implements Strategy {
    algorithmInterface(a: number, b: number) {
        return a - b
    }
}
 
class Main {
    constructor() {
        const concreteStrategyA = new ConcreteStrategyA()
        const concreteStrategyB = new ConcreteStrategyB()
        const concreteStrategyC = new ConcreteStrategyC()
        const context = new Context(concreteStrategyA)

        context.contextInterface() // 25

        context.changeStrategy(concreteStrategyB)
        context.contextInterface() // 10

        context.changeStrategy(concreteStrategyC)
        context.contextInterface() // 0
    }
}
 

 


 

 

공식 기술블로그 링크

 

728x90