본문 바로가기

Design Pattern

디자인 패턴 - 행위(Behavioral)패턴 - Strategy

반응형
SMALL

Strategy 패턴은

문제 해결하는 데 있어 다양한 알고리즘이 적용될 수 있는 경우에 알고리즘을 별도로 분리하는 패턴이라고 한다.

특정 객체에 종속되지 않으며 알고리즘에 대한 확장과 변경이 용이해진다고 한다.

 

 

SumPrinter는 출력을 하는데,

SumStrategy가 반환하는 합계 값을 출력한다.

실제 동작에 대해서는 SimpleSumStrategy와 GaussSumStrategy에서 구현한다.

이 구조를 통해 필요에 따라 일련의 동작 중에서 다른 알고리즘을 적용하여 동작할 수 있다고한다.

추후에 SumStrategy를 통해서 새로운 알고리즘을 구현해도,

SumPrinter는 실제 알고리즘에 대한 정보를 가지고 있지 않기 때문에

SumPrinter의 사용방식이 바뀌지 않게 되는 장점이 있다고 한다.

 

 

먼저 Sumprinter 클래스를 구현한다.

SumStrategy 타입의 객체(실제 알고리즘을 구현한 클래스의 객체)를 하나 받고,

1에서 N까지의 합을 구하기 위한 N 값을 받는다.

public class SumPrinter {
  public void print(SumStrategy strategy, int N) {
    System.out.printf("The Sum of 1 - %d : ", N);
    System.out.println(strategy.get(N));
  }
}

 

SumStrategy는 1부터 N까지의 합을 구하는 메소드를 가진 인터페이스이다.

public interface SumStrategy {
  int get(int N);
}

 

SimpleSumStrategy는 SumStrategy를 상속 받아 get 메소드를 구현한다.

public class SimpleSumStrategy implements SumStrategy{
    @Override
    public int get(int N) {
      int sum = N;

      for(long i=1; i<N; i++) {
        sum += i;
      }

      return sum;
    }
}

 

GaussSumStrategy도 동일하게 SumStrategy를 상속 받아 get 메소드를 구현한다.

public class GaussSumStrategy implements SumStrategy {
  @Override
  public int get(int N) {
    return (N+1)*N/2;
  }
}

 

메인 메소드에서는

SumPrinter 인스턴스를 생성하고,

print 메소드를 이용하여 두가지 알고리즘을 한 가지 사용 방법으로 사용하고 있다.

public class MainEntry {
  public static void main(String[] args) {
   
    SumPrinter cal = new SumPrinter();
    cal.print(new SimpleSumStrategy(), 10);
    cal.print(new GaussSumStrategy(), 10);

  }
}

 

이처럼 하나의 기능에 대해서 서로 다른 방식의 구현을 실행 중에 변경할 수 있다.

 

 

이 글은 

 

https://www.youtube.com/watch?v=Wao5HiXM_Cg&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=3

 

위 유튜브 영상 강의를 보고 작성했습니다.

반응형
LIST