전략 패턴

반응형
반응형

이 패턴 
생각보다 쉽지 않다.
패턴에 대해 간략하게 설명하면 전략을 구분짓는 패턴이다.
당연한 이야기 지만 이런이야기는 누구나 할 수 있다.

그러면 다음 코드를 보고 이것이 어떤 패턴인 맞출 수 있을까?

Template template = new Template(new Action());

지금까지 학습한 팩토리, 추상 팩토리, 빌링, 프로토 패턴인데 이것만 봐도
아쉽게도  전략패턴인지 확신을 가질 수 없다.
이는 저번 포스트에서 말했듯이 관점에 따라 패턴의 이름이 달라질 수 있다.
디자인 패턴을 공부하면서 빌더 패턴 처럼 딱 떨어지는 패턴이 있는 반면에 
대부분 패턴들은 딱 떨어지지 않는다는 사실을 알 수 있다.

누군가가 위 코드는 추상 팩토리  패턴이라고 말한다면, 틀린것일까?

지금은 추상 팩토리와 전략 패턴의 차이점을 말하는 포스팅이 아니기 때문에 이건 이쯤하고 넘어갈 예정이다.

본론

자 본격적으로 전략 패턴에 대해 학습해보자.
자바에서 전략을 가질 수 있는 방법은 총 2가지가 존재한다.
클래스를 extends하는 방법
인터페이스를 implements하는 방법 이렇게 2가지로 특정한 전략을 생성할 수 있다.
그러면 클래스로 만드는게 좋을까? 아니면 인터페이스일까?
어떤 것으로 만드든 그것은 자유지만 웬만하면 인터페이스로 만드는 것을 추천한다.
이것까지 말하면 포스팅이 길어질 수 있으니 이것은 인터페이스 에서 작성해두었다.
 

그러면 간단한 예제가 필요한다.
저번 포스팅에서는 Template 클래스로 도배를 했다면 이번에는 간단한 예제를 통해 설명하는 것도 나쁘지 않을 것 같다.

예제는 다음과 같다.
특정 배열(int)를 받으면 이것을 오름 차순으로 할지 내림 차순으로 할지 결정한다.

간단히 클래스명은 SortStrategy 

public interface SortStrategy {
  List<Integer> sort(List<Integer> nums);
}

오름 차순 전략은 다음으로 작성하자.

public class AscendingStrategy implements SortStrategy {

  @Override
  public List<Integer> sort(List<Integer> nums) {
    Collections.sort(nums);
    return nums;
  }
}

위 전략을 사용하는 클래스를 만들면 (여기는 이름을 대충 지엇습니다.)

public class Action {
  private SortStrategy sortStrategy;

  public Action(SortStrategy sortStrategy) {
    this.sortStrategy = sortStrategy;
  }

  public List<Integer> sort(List<Integer> nums) {
    return sortStrategy.sort(nums);
  }
}

전략 패턴준비 과정은 끝났다.

이제 요런식으로

public class App {

  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1, 5, 2, 9, 10);
    Action action = new Action(new AscendingStrategy());
    System.out.println(action.sort(nums));
  }
}

print를 하면 된다.
이제 내림 차순도 한번 해보자.
잘 된다. 뭐 이것을 굳이 찍어서 올릴 필요는 없을 것 같구
이제 

Action action = new Action(new AscendingStrategy());

이 부분만 변경하면 원하는 결과를 얻을 수 있다.

public interface SortStrategy {
  List<Integer> sort(List<Integer> nums);
}

이 코드를 보면 메소드가 하나다.
그래서 다음처럼 작성할 수 있다.

public class App {

  public static void main(String[] args) {
    List<Integer> nums = Arrays.asList(1, 5, 2, 9, 10);
    Action action = new Action(i -> i.stream().filter(j -> j%2!=0).collect(Collectors.toList()));
    System.out.println(action.sort(nums));
  }
}

정리

전략까지 짜는건 그리 어렵지 않았다.
하지만 이것을 바로 main문에서 보여줘야 할지 고민이었다.
이렇게

SortStrategy sortStrategy = new AscendingStrategy();
List<Integer> sort = sortStrategy.sort(nums);
System.out.println(sort);

작성해도 전략 패턴이다.
왜냐하면 new를 수정하면 되기 때문이다.
하지만 위 방식을 채택한 이유는 전략패턴을 사용한 클래스를 무언가로 감쌀려고 할때, 어떻게 해야할지
보여주기 위함이었다.

다음은 어떤 패턴을 학습할까?

 

반응형

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

퍼사드 패턴  (0) 2021.12.05
브릿지 패턴  (0) 2021.11.25
팩토리 메소드 패턴 vs 추상 팩토리 패턴  (0) 2021.11.11
싱글톤 패턴  (0) 2021.11.03
탬플릿 패턴  (0) 2020.06.05

댓글

Designed by JB FACTORY