[TIL]230409 - 전략 패턴(AOP #02)

insightp25·2023년 4월 9일

개요

전략 패턴은 변하지 않는 부분을 context에 두고, 변하는 부분을 strategy라는 인터페이스에 두고, 해당 인터페이스를 구현하도록 하여 문제를 해결한다.

템플릿 메서드 패턴과의 차이

  • 상속이 아닌 위임으로 문제를 해결:

    • context는 변하지 않는 템플릿 역할을,
    • strategy는 변하는 알고리즘 역할을 한다.
  • 전략 패턴의 구현에는

    • strategy를 context 내부 필드에 저장하는 방식과,
    • 인수로 strategy를 전달받는 방식

    의 두 가지 방식이 있다.


strategy를 필드에 저장하는 방식

구현 방법

  • context의 내부 필드에 strategy를 주입해서 사용
  • 선 조립, 후 실행 방식에 적합
    • context의 내부 필드에 strategy를 두고 사용
    • context와 strategy를 실행 전에 원하는 모양으로 조립 후, 그 다음 context를 실행
  • context와 strategy를 한 번 조립하고 나면 이후는 context를 실행하기만 하면 된다.

필드 저장 방식의 한계

  • 한 번 조립 후 strategy를 변경하기가 번거롭다.
    • context에 setter 제공, strategy 변경하면 되지만, context를 싱글톤으로 사용할 경우 동시성 이슈 등 고려할 점이 많다.
    • 전략을 실시간으로 변경해야 하면 context를 하나 더 생성하고 그 곳에 다른 strategy를 주입하는 게 더 나은 선택일 수 있다.

인수로 strategy를 전달받는 방식

구현 방법

  • context 실행 시점에 strategy를 인수로 전달

인수 전달 방식의 장점

  • 원하는 전략을 유연하게 변경할 수 있다.
  • 하나의 context만 생성하여 인수(strategy)만 바꿔가며 유연하게 실행할 수 있다.

인수 전달 방식의 단점

  • 실행 시마다 전략을 계속 지정하여야 하는 점

Etc.

디자인 패턴의 '의도'(feat. GoF)

  • 디자인 패턴은 구조도 구조이지만 '의도'가 중요하다.

  • 전략 패턴의 경우

    1. 알고리즘 제품군을 정의하고
    2. 각각을 캡슐화하여 상호 교환 가능하게 만든 후,
    3. 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있도록 하는 것

    이 그 '의도'이다.

  • 필드 저장 방식이든, 인수 전달 방식이든 상기의 '의도'를 충족하므로 전략 패턴이라고 할 수 있다.

전략 패턴 코드를 구현하는 다양한 방식

  • interface를 구현하는 strategy 클래스를 생성할 수도(객체를 계속 생성해야한다는 단점 존재),
  • context에서 바로 익명 내부 클래스에 strategy 로직을 정의해 사용할 수도,
  • lambda식으로 표현할 수도 있다.


reference

profile
backend, data-streaming, AI

0개의 댓글