본 게시글은 '헤드퍼스트-디자인 패턴 (개정판)'을 기준으로 작성된 글입니다.
전략 패턴이란?
전략 패턴이란 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해준다. 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다.
왜 사용할까?
예를들어 오리 시뮬레이션 게임을 제작한다고 가정해보자.
먼저 Duck 이라는 슈퍼 클래스를 만들고, 클래스를 확장하여 다른 종류의 오리들을 만들었다고 가정해보자.

만약 fly() 기능을 추가해달라고 한다면?
기존의 Duck 클래스에 fly()를 추가해주고, 각 서브클래스에서 fly()를 상속받게 해준다.

날면 안되는 오리가 있다면?
날면 오리가 안되는 오리가 있다면, 수퍼 클래스에 fly()를 추가하는 행동으로 날면 안되는 서브 클래스에도 영향이 미치게 된다.
아! 상속을 고려해보자!
날면 안되는 오리의 서브클래스의 fly()를 오버라이드해서 고치면 된다!
근데.. 다른 새로운 서브클래스들을 만들 때 마다 새롭게 오버라이딩 해야하는 번거로움이 생긴다.
상속은 올바른 해결책이 아니야.. 그러면 인터페이스를 써보자
날기와 울기를 인터페이스화 시켜서 날 수 있는 오리와, 꽦꽦 울 수 있는 오리가 구현해서 사용하도록 하였다.
그래도 남아있는 문제점..
- 코드 중복이 발생한다
- 날아가는 동작을 바꾸기 위해 서브클래스의 fly() 코드를 수정해야 한다.
- fly 방식이 오리마다 다를 수 있다.
아! 캡슐화
달라지는 부분을 찾아내고, 달라지지 않는 부분과 분리한다
- 디자인 원칙 중 첫번째 원칙-
달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않는다면, 코드를 변경하는 과정에서 의도치 않게 발생하는 일을 줄일 수 있다.
그렇다면? 위에서 작성한 Duck 클래스에서 변하는 부분은 무엇일까?
- 변하는 부분
- 날기
- 꽦꽥거리기
나는 행동을 구현하는 FlyBehavior()이라는 인터페이스를 구현하고, 각 나는 방법이 구현되어 있는 나는 행동만을 목적으로 정의된 클래스의 집합을 만들어낸다.

이렇게 한다면, 다른 형식의 객체에도 나는 행동과 꽦꽥 행동을 재사용 할 수 있다. 기존의 행동 클래스를 수정하거나 날아가는 행동을 사용하는 Duck 클래스를 건들지 않고도 새로운 행동을 추가할 수 있다.
행동을 통합하기
각 인터페이스 형식의 인스턴스 변수를 Duck()클래스에 추가하고, 날거나 우는 행동을 하는 함수를 다형적으로 설정한다.
기존의 날기를 담당하던 fly()를 performFly()로 대채하여, 나는 행동을 직접 처리하지만, 참조되는 FlyBehavior 객체에 행동을 위임하도록 한다. 이렇게 되면, 객체의 종류에 신경 쓸 필요없이 fly()를 실행할 줄만 알고 있으면 된다.
과정 돌아보기
지금까지 진행한 과정이 즉 "전략 패턴" 입니다.
캡슐화된 알고리즘은 나는 행동이며, 각각의 알고리즘을 수정해서 사용할 수 있었다. 이렇게 되면, 누군가 나는 행동에 대한 갑작스러운 요구가 들어왔을 때, 보다 쉽게 할 수 있다.
'디자인패턴' 카테고리의 다른 글
디자인 패턴 - 팩토리 패턴 (0) | 2023.09.05 |
---|---|
[디자인 패턴] - 데코레이터 패턴 (1) | 2023.09.01 |
[디자인 패턴] - 옵저버 패턴 (0) | 2023.08.31 |