> For the complete documentation index, see [llms.txt](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/dev_note/system-design/design-pattern/undefined-2.md).

# 전략 패턴

## 전략 패턴

> **애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다**. - 디자인 원칙

* 달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 '**캡슐화**'한다.
* 코드를 변경하는 과정에서 의도치 않게 발생하는 일을 줄이면서 시스템의 **유연성을 향상**시킬 수 있다.
* 요구사항이 있을 때마다 바뀌는 부분이 있다면 분리해야 한다.
* 바뀌는 부분은 뽑아서 캡슐화, 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 해당 부분만 고치거나 확장할 수 있다.
* 자주 바뀌는 부분과 바뀌지 않을 부분을 분리하기!
  * 자주 바뀌는 부분과 바뀌지 않는 부분을 처음 설계 단계부터 판단할 수 있는가?
* <mark style="color:purple;">구현보다는 인터페이스에 맞춰서 프로그래밍 한다</mark>
  * \=== 상위 형식에 맞춰서 프로그래밍한다.
* 바뀌는 부분을 별도의 행동 클래스로 만들어 위임한다

{% hint style="info" %}
런타임 중 동적으로 행동을 바꾸고 싶다면 행동에 해당하는 세터 메서드를 호출하자.
{% endhint %}
