전략 패턴은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해 쓸 수 있게 한다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.
어떤 객체의 행동에 대해서, 구체적인 구현 방법을 실행 중에 변경하고 싶을 때 사용한다. 예를 들어 계산기의 덧셈 기능에 대해 일반 계산기에 대해서는 누적합을 구하는 방식으로 덧셈을 하도록 하고, 공학 계산기에 대해서는 가우스 합을 구하는 방식으로 덧셈을 하도록 하고 싶을 때 사용할 수 있다.
어떤 행동을 할 수 있는 Context 객체가 존재한다. 이 객체는 각 행동에 대해 클라이언트가 원하는 방식으로 행동할 수 있어야 한다. 그러려면 클라이언트가 원하는 방식으로 행동하는 책임을 가지는 구상 전략 클래스가 필요하다. 구상 클래스는 실행 중에 클라이언트의 요청에 다라 다르게 주입되므로 Strategy 인터페이스로 감싸야 한다.
상속보다는 구성을 사용한다
행동을 인터페이스로 분리할 필요 없이, 행동을 정의하는 슈퍼 객체를 상속받아 오버라이딩하여 사용할 수도 있다. 하지만 상속을 활용하는 방법은 객체를 새로 만들 때마다 메소드를 하나씩 살펴보고 오버라이딩해주어야 한다. 만약 실수로 오버라이딩하지 않으면 우리가 원하는대로 동작하지 않는다.
바뀌는 부분은 캡슐화한다
전략 패턴을 적용할만한 상황에서 문제가 되는 부분은 행동의 구현 방식이 객체에 따라 달라진다는 부분이다. 바뀌는 부분은 따로 뽑아서 캡슐화한다. 그러면 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있게 된다.