전략 패턴

반응형
반응형

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

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

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
전략 패턴  (0) 2021.11.19
팩토리 메소드 패턴 vs 추상 팩토리 패턴  (0) 2021.11.11
싱글톤 패턴  (0) 2021.11.03
탬플릿 패턴  (0) 2020.06.05

댓글(0)

Designed by JB FACTORY