스트래티지 패턴은 알고리즘 혹은 행동을 정의해 놓고 클라이언트가 동적으로 사용할 수 있게 해준다.
아레 이미지에서 보면 Strategy Interface를 구현한 객체는 AlgorithmInterface를 구현한 객체를 동적으로 받아서 사용할 수 있도록 되어 있다. 즉 ConcreteStrategyA,ConcreteStrategyB 중에 아무거나 사용할 수 있는 것이다.
Strategy interface를 구현한 객체는 AlgorithmInterface를 구현한 ConcreteStrategyA,ConcreteStrategyB 중 어떤 것을 받아 오느냐에 따라 Behavior가 달라지게 된다.
아래는 위키에 나온 스트래티지 패턴 java 예시
항상 예를 보면 쉽다.
// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object
class Context { private Strategy strategy; // Constructor public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int a, int b) { return strategy.execute(a, b); } }
아래는 Context라는 class인데 생성자에서 Strategy라는 interface를 구현한 class를 받아온다.
받아온 Strategy에 따라서 trategy.execute(a, b);가 어떤 행동(알고리즘을 사용할지) 결정된다.
그렇다. Strategy inteface 아래와 같이 nt execute(int a, int b)라는 행동만 정의해 놓았다.
따라서 이 Strategy interface를 구현한 class의 execute에 의해 행동이 결정되는 것이다.
// The classes that implement a concrete strategy should implement this // The context class uses this to call the concrete strategy interface Strategy { int execute(int a, int b); }
아래는 Strategy interface를 구현한 덧셈, 뺄셈, 곱셈의 클래스
Context class를 생성할때 아래 3가지 중 하나를 골라 줄 수 있다.
// Implements the algorithm using the strategy interface class ConcreteStrategyAdd implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategyAdd's execute()"); return a + b; // Do an addition with a and b } } class ConcreteStrategySubtract implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategySubtract's execute()"); return a - b; // Do a subtraction with a and b } } class ConcreteStrategyMultiply implements Strategy { public int execute(int a, int b) { System.out.println("Called ConcreteStrategyMultiply's execute()"); return a * b; // Do a multiplication with a and b } }
위키의 main은 아래와 같다. 결과는 예측 가능 하다.
//StrategyExample test application class StrategyExample { public static void main(String[] args) { Context context; // Three contexts following different strategies context = new Context(new ConcreteStrategyAdd()); int resultA = context.executeStrategy(3,4); context = new Context(new ConcreteStrategySubtract()); int resultB = context.executeStrategy(3,4); context = new Context(new ConcreteStrategyMultiply()); int resultC = context.executeStrategy(3,4); } }
어디에 사용하면 좋을까?
아래책의 1장을 읽어보길 바란다. ^^
HeadFirstDesignPatterns 카테고리 지은이 상세보기
'Design pattern' 카테고리의 다른 글
Delegate pattern (디자인 패턴) (3) | 2011.09.27 |
---|