Strategy Pattern

Learning/Design Pattern 2010.01.16 12:40

Strategy Pattern은 필요한 알고리즘들을 한데 묶어 정의하고 묶은 알고리즘 각각을 캡슐화하여 (서로 다른 클래스 간에)교환 가능하도록 합니다. 자바에서는 이 알고리즘들을 묶기 위해 인터페이스를 사용합니다.

다른 분들은 어떻게 보실지 모르겠지만, 제가 생각하기에 이 패턴은 알고리즘이 필요한 클래스들을 수평적인 위치에 올려놓게 됩니다. 계급 사회에서는 부모가 백정일 때만 백정 일을 할 수 있었지만, 평등 사회에선 누구나 정육점 주인이 될 수 있겠죠. 나는 백정이다. 가 아닌 나는 백정 일을 할 수 있다.로 변한 것이죠. 즉, 모든 사람이 공평하게 일(알고리즘)을 할(가질) 수 있게(interchangable) 되는 것입니다. 공평하니까 좋구나.. 는 아니고 이 패턴을 적용해서 나타나는 양상이 그렇다는 것입니다.

역시 똑같은 일을 '상속'을 사용해서 구현했을 때와 비교하면 이 패턴의 장점을 가장 쉽게 알 수 있습니다.

어떤 클래스가 자신이 할 수 있는 행동(전략)을 결정할 수 있게 하므로 필요할 때마다 행동(전략)을 쉽게 변경 할 수 있어 상속보다 유연성이 높습니다.

<상속을 사용했을 때보다 좋은 점>
* ()안은 Strategy Pattern에 적용되었을 경우.
1. 자식 클래스(전략을 사용하는 클래스)에서 세부적인 행동(전략)을 위해 코드를 다시 작성할 필요가 없습니다. (코드의 재사용)
2. 실행시에 행동(전략) 패턴을 쉽게 변경할 수 있습니다.
3. 부모 클래스(전략 클래스)에 변경이 생겼을 때 자식 클래스(전략을 사용하는 클래스)가 의도하지 않은 영향을 받지 않게 됩니다.


Company클래스는 전 세계의 회사를 대표하는 최상위 클래스라고 합시다. 그 클래스를 상속받는 두개의 ABC,DEF 회사가 있습니다.(더 많겠지만 일단 둘만 생각합시다.) 그리고 마케팅 전략은 두 가지가 있고, ABC에서는 혁신 중심 전략을, DEF에서는 성장 중심 전략을 사용한다고 합시다.

만약 이것을 마케팅 전략 인터페이스를 사용하지 않고 상속으로 구현한다고 한다면, Company는 setStrategy()라는 함수와 doStrategy()라는 함수를 ABC,DEF 회사에서 구현하도록 해야 합니다. ABC 회사는 나름대로 혁신 중심 전략을 위한 코드를 열심히 때려 박아야 할 것이고, DEF 회사는 성장 중심 전략의 내용을 열심히 넣고 있겠죠. 만약 (저기엔 없지만)GHI 회사가 있는데 성장 중심 전략을 사용하기로 결정했다면, DEF회사와 똑같은 일을 또 반복해야 합니다. 아무 전략도 세우지 않은 JKL 회사는 또 아무것도 하지 않는다고 명시해줘야 합니다. 이것이 바로 (1)코드의 중복입니다. 각각의 회사는 일일히 방법을 적어 내려가는 것이 아니라 마케팅 전략에 대한 매뉴얼(stratgy) 하나만 가지면 됩니다.

또한 회사에서 어떤 회의를 통해 다른 마케팅 전략을 사용하기로 했다면, setStrategy(새로운 마케팅 전략 오브젝트)를 한번 실행해주기만 하면 됩니다. 가지고 있던 매뉴얼(stratgy)만 바꾸었을 뿐인데 doStrategy()의 결과조차도 바뀌게 됩니다. 이렇게 해서 (2)실행시간 내 행동 변경을 가능하게 합니다.

만약 전략을 실행한 후 결과 보고가 반드시 필요하다고 생각한 어떤 사람이 Company 클래스의 doStrategy() 메소드에 결과 보고를 하도록 구현해 놓았다면, Company를 상속 받은 모든 회사 클래스에서 doStrategy()를 실행할때 사이드 이펙트가 생기지 않는지 일일히 확인해야 합니다. 하지만 상속을 사용하지 않고 마케팅 전략 인터페이스 매뉴얼을 소유한 회사들은 그런 변화에 전혀 영향을 받지 않게 됩니다. 만약 성장 중심 전략의 수행에 어떤 변화가 있다면 그 성장 중심 전략 매뉴얼을 가진 회사들만 영향을 받게 될 테니까요. 이렇게 함으로써 (3)의도하지 않은 영향을 최소화 할 수 있게 됩니다.

상속도 나름대로의 장점이 있지만, 꼭 그렇게 딱딱해져야 할 필요가 있나 싶을 때 이 패턴을 떠올려 보세요.





참고 : Head First Design Patterns 1장 디자인 패턴 소개
저작자 표시 비영리
신고
posted by purecolor