스트래티지 패턴(Strategy Pattern)
- 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다. 프로그램에서 전략을 실행할 때는 쉽게 전략을 바꿔야 할 필요가 있는 경우가 많이 발생한다. 특히 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에 따라 공격이나 행동하는 방식을 바꾸고 싶을 때 스트래티지 패턴은 매우 유용하다.
로봇 만들기 Example
문제점
- 1) 기존 로봇의 공격 또는 이동 방법을 수정하려면 어떤 변경 작업을 해야 하는가? 예를 들어 아톰이 날 수는 없고 오직 걷게만 만들고 싶다면? 또는 태권V를 날게 하려면?
- => 새로운 기능으로 변경하고 기존 코드의 내용을 수정해야 하므로 OCP에 위반
- 2) 새로운 로봇을 만들어 기존의 공격 또는 이동 방법을 추가하거나 수정하려면? 예를 들어 새로운 로봇으로 지구의 용사 선가드(Sungard 클래스)를 만들어 태권V의 미사일 공격 기능을 추가하려면?
- => 코드 중복 발생 (Bad Smell) -> 리팩토링
- => 코드 중복 발생 (Bad Smell) -> 리팩토링
해결책
- 무엇이 변화되었는지를 찾은 후에 이를 클래스로 캡슐화 한다.
예제1. 다음 설계의 문제를 지적하고 스트레티지 패턴을 사용하여 작성하라
- 임금을 계산하는 로직이 변경되면 내부코드를 수정해야 한다.
스트래티지 패턴의 일반적인 형태
- Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
- ConcreteStrategy1, ConcreteStrategy2, ConcreteStrategy3: 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
- Context: 스트래티지 패턴을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀수 있도록 setter메서드를 제공한다.
스트래티지 패턴의 순차다이어그램
스트래티지 패턴을 로봇 예제에 적용한 경우
출처
- Java객체지향 디자인패턴(한빛미디어)