---
description: 전략 패턴
---

# Strategy Pattern

## 정의

실행 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴입니다. 어떤 일을 수행하는 알고리즘이 여러개 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴입니다.

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FVUDBZN2girJrvkB7hCv7%2Fimage.png?alt=media&#x26;token=8c083213-9579-46ad-82d1-7e7fb38475a9" alt=""><figcaption></figcaption></figure>

## 전략 패턴 구조

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FlT88IRIIHkulwQJNkqPh%2Fimage.png?alt=media&#x26;token=45c17601-12c2-45f8-b69d-479566b87700" alt=""><figcaption></figcaption></figure>

* 전략 알고리즘 객체들: 알고리즘, 행위, 동작을 객체로 정의한 구현체
* 전략 인터페이스: 모든 전략 구현제에 대한 공용 인터페이스
* 컨텍스트: 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출
* 클라이언트: 특정 전략 객체를 컨텍스트에 전달 함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행한 결과를 가져옵니다.



## 전략 패턴 흐름

<figure><img src="https://2804243633-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfV6clXG953LqFieNgWUf%2Fuploads%2FAx5nO7Q0kACaod8pYDKj%2Fimage.png?alt=media&#x26;token=7a4a8237-22eb-43b8-8d9d-6d84075fef7f" alt=""><figcaption></figcaption></figure>

```java
// 전략(추상화된 알고리즘)
interface IStrategy {
    void doSomething();
}

// 전략 알고리즘 A
class ConcreteStrateyA implements IStrategy {
    public void doSomething() {}
}

// 전략 알고리즘 B
class ConcreteStrateyB implements IStrategy {
    public void doSomething() {}
}
    
class Context {
    IStrategy Strategy; // 전략 인터페이스를 합성(composition)
	
    // 전략 교체 메소드
    void setStrategy(IStrategy Strategy) {
        this.Strategy = Strategy;
    }
	
    // 전략 실행 메소드
    void doSomething() {
        this.Strategy.doSomething();
    }
}
```



## 전략 패턴과 OOP

전략 패턴은:

* 동일 계열의 알고리즘군을 정의합니다 (전략 구현체로 정의)
* 각각의 알고리즘을 캡슐화 합니다 (인터페이스로 추상화)
* 이들을 상호 교환이 가능하게 합니다 (Composition으로 구성)
* 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 동작한다. (컨텍스트 객체 수정없이)
* 알고리즘을 다양하게 변경할 수 있게 한다. (메소드를 통해 전략 객체를 실시간으로 변경)
