상세 컨텐츠

본문 제목

Strategy Pattern 배워보기

Java

by techbard 2014. 1. 16. 15:20

본문

반응형

Strategy Pattern이라는 이름이 붙은 패턴을 공부해 보았다.

 

 

 

클래스 다이어그램으로는 별로 이 패턴에 대해 이해할 수 없다.

 

1. 최상위 인터페이스를 작성한다.

 

public interface IStrategy {
 int execute(int a, int b);
}

 

2. 호출 방법은 통일되어 있지만 뒷단의 구현을 바꿔가면서 다르게 하고 싶은 클래스들을 작성한다. 단 메소드 이름은 동일해야 하기 때문에 각 클래스는 1번의 인터페이스를 구현한다.

 

public class ConcreteStrategyAdd implements IStrategy {

 @Override
 public int execute(int a, int b) {
  System.out.println("Called ConcreteStrategyAdd's execute()");
  return a + b;
 }
}

 

public class ConcreteStrategyMultiply implements IStrategy {

 @Override
 public int execute(int a, int b) {
  System.out.println("Called ConcreteStrategyMultiply's execute()");
  return a * b;
 }
}

 

public class ConcreteStrategySubtract implements IStrategy {

 @Override
 public int execute(int a, int b) {
  System.out.println("Called ConcreteStrategySubtract's execute()");
  return a - b;
 }
}

 

3. 중간에 바꿔치기 해주는 클래스를 작성한다.

 

public class Context {

 private IStrategy iStrategy;

 public Context(IStrategy iStrategy) {
  this.iStrategy = iStrategy;
 }
 
 public int executeStrategy(int a, int b) {
  return iStrategy.execute(a, b);
 }
}

 

역시나 멤버에 생성자를 통해 받은 인터페이스 타입의 객체변수를 저장한다.

또 이 멤버를 통해 실제 수행하고자하는 메소드를 호출해 주는 호출 메소드를 작성한다. 당연히 메소드의 시그니쳐 (파라메터 수와 타입)는 동일해야 한다.

 

4. 테스트 클래스 작성

public class StrategyPatternTest {

 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);
 }
}

 

결과:

Called ConcreteStrategyAdd's execute()
Called ConcreteStrategySubtract's execute()
Called ConcreteStrategyMultiply's execute()

 

이렇게 해서 전체 구조는 그대로 둔채, 기존에 만들어둔 하부 클래스의 내용을 바꿔치기 하면 그 부분의 수정만으로 전체 기능은 유지한 채로 세부 클래스의 동작만 바꿀 수 있다.

 

참고한 튜토리얼에서는 다음과 같이 이 패턴의 의도를 설명하고 있다.

 

"Define a family of algorithms, encapsulate each one, and make them interchangeable to let clients and algorithms vary independently."

 

"When an object should be configurable with one of many algorithms."

"and all algorithms can be encapsulated"

"and one interface covers all encapsulations."

 

 

StrategyPattern.zip

 

반응형

관련글 더보기

댓글 영역