본문 바로가기

Design pattern

스트래티지 패턴 (strategy pattern)


스트래티지 패턴은 알고리즘 혹은 행동을 정의해 놓고 클라이언트가 동적으로 사용할 수 있게 해준다. 

아레 이미지에서 보면 Strategy Interface를 구현한 객체는 AlgorithmInterface를 구현한 객체를 동적으로 받아서 사용할 수 있도록 되어 있다. 즉 ConcreteStrategyA,ConcreteStrategyB 중에 아무거나 사용할 수 있는 것이다. 
Strategy interface를 구현한 객체는 AlgorithmInterface를 구현한 ConcreteStrategyA,ConcreteStrategyB 중 어떤 것을 받아 오느냐에 따라 Behavior가 달라지게 된다. 

File:Strategy Pattern Diagram ZP.svg


아래는 위키에 나온 스트래티지 패턴 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
카테고리 과학/기술 > 컴퓨터 > 프로그래밍
지은이 Freeman, Eric/ Freeman, Elisabeth/ Sierra, Kathy/ (Oreilly&Associates, 2004년)
상세보기





'Design pattern' 카테고리의 다른 글

Delegate pattern (디자인 패턴)  (3) 2011.09.27