본문 바로가기

디자인 패턴

디자인패턴 : Strategy


전략 디자인패턴
 

- 동일 계열의 알고리즘을 정의하고, 각각의 알고리즘을 캡슐화하며, 이들을 상호교환이 가능하도록 만듭니다. 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 변경할 수 있게한다. 정책(Policy) 패턴이라고도 한다.

 클래스 설명

 전략패턴은 다음과 같은 상황에서 사용하면 되겠다.

행동들이 조금씩 다를 뿐 개념적으로 관련된 많은 클래스들이 존재할 때, 전략패턴은 많은 행동 중 하나를 가진 클래스를 구현할 수 있는 방법을 제공한다.

 알고리즘의 변형이 필요할 때, 이를테면, 기억 공간과 처리 속도 간의 절충에 따라 서로 다른 알고리즘을 정의할 수 있을 것이다. 이러한 변형물들이 알고리즘의 상속 관계로 구현될 때 전략 패턴을 사용할 수 있다. 

사용자가 몰라야 하는 데이터를 사용하는 알고리즘이 있을 때, 노출하지 말아야 할 복잡한 자료 구조는 Strategy 클래스에만 두면 되므로 사용자는 몰라도 된다. 

하나의 클래스가 많은 행동을 정의하고, 이런 행동들이 그 클래스의 연산 안에서 복잡한 다중 조건문의 모습을 취할 때, 많은 조건문보다는 각각을 Strategy 클래스로 옮겨놓는 것이 좋다.

 클래스 사용


var composition: Composition = new Composition( new ConcreteStrategyA() ); //알고리즘 A 적용
var composition: Composition = new Composition( new ConcreteStrategyB() ); //알고리즘 B 적용
var composition: Composition = new Composition( new ConcreteStrategyC() ); //알고리즘 C 적용


 클래스 구성 

Context ( Composition )

- ConcreteStategy 객체를 통해 구성된다. 즉, Strategy 객체에 대한 참조자를 관리하고, 실제로는 Strategy 서브클래스의 인스턴스를 갖고 있음으로써 구체화한다. 또한 Strategy 객체가 자료에 접근해가는 데 필요한 인터페이스를 정의한다.

 package
{
     public class Composition
     {
          private var _strategy: Compositor; 

          public function Composition( c: Compositor )
          {
               _strategy = c;
          }
          public function setLayout(): void
          {
               _strategy.compose( 레이아웃 요소를 넘겨줌 );
          }
     }
}

 Strategy( Compositor )

- 제공하는 모든 알고리즘에 대한 공통의 연산들을 인터페이스로 정의한다. Context 클래스는 ConcreteStrategy 클래스에 정의한 인터페이스를 통해서 실제 알고리즘을 사용한다.

 package
{
     public interface Compositor
     {
          function compose( 레이아웃 요소를 넘겨받음 ): void;
     }
}

 ConcreteStrategy( ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC )

- Strategy 인터페이스를 실제 알고리즘으로 구현한다. 

package
{
     public class ConcreteStrategy implements Compositor
     {
          public function ConcreteStrategy()
          {             

          }
          public function compose( 레이아웃 요소를 넘겨받음 ): void
          {
               //알고리즘 구현생략...
          }
     }

 

'디자인 패턴' 카테고리의 다른 글

디자인패턴 : Adapter  (0) 2011.08.03
디자인패턴 : Decorator  (0) 2011.08.03
디자인패턴 : Proxy  (0) 2011.08.03
GOF 의 디자인패턴  (0) 2010.10.25
디자인패턴의 개요  (0) 2010.10.25