코드/GOF

디자인 패턴 - 행위(Behavioral) 패턴 (10) 전략 패턴(Strategy Pattern)

미로처럼 2024. 3. 19. 15:35
728x90

전략 패턴은 실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴.

알고리즘 변형이 빈번하게 필요한 경우에 적합한 패턴

 

구조

 

 

전략 알고리즘 객체들(ConcreateStrategy1, ConcreateStrategy2, ConcreateStrategy3)

  • 알고리즘, 행위, 동작을 객체로 정의한 구현체

 

전략 인터페이스(Strategty)

  • 모든 전략 구현체에 대한 공용 인터페이스

 

컨텍스트(Context)

  • 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출

 

클라이언트

  • 특정 전략 객체를 컨텍스트에 전달 함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행한 결과를 누린다.

 

 

특징

 

전략패턴은 SOLID 원칙의 OCP원칙, DIP원칙, 합성(composition), 다형성(polymorphism), 캡슐화(encapsulation) 등 OOP 기술들의 총 집합 버전이라고 보면 된다.

 

 

 

  • 동일 계열의 알고리즘군을 정의 - 전략 구현체로 정의
  • 각각의 알고리즘을 캡슐화하여 - 인터페이스로 추상화
  • 이들을 상호 교환이 가능하도록 만든다. - 합성(composition)으로 구성
  • 알고리즘을 사용하는 클라이언트와 상관없이 독립적 - 컨텍스트 객체 수정 없이
  • 알고리즘을 다양하게 변경할 수 있게 한다. - 메소드를 통해 전략 객체를 실시간으로 변경함으로써 잔략을 변경

클래스 구성

 

클래스 흐름

 

 

사용 시기

  • 전략 알고리즘의 여러 버전 또는 변형이 필요할 때 클래스화를 통해 관리
  • 알고리즘 코드가 노출되어서는 안되는 데이터에 엑세스 하거나 데이터를 활용할 때(캡슐화)
  • 알고리즘의 동작이 런타임에 실시간으로 교체 되어야 할때
  •  

주의점

  • 알고리즘이 많아질수록 관리해야할 객체의 수가 늘어난다는 단점
  • 만일 어플리케이션 특성이 알고리즘이 많지 않고 자주 변경되지 않는다면, 새로운 클래스와 인터페이스를 만들어 프로그램을 복잡하게 만들 이유가 없다.
  • 개발자는 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다.(복잡도가 올라감)

 

 

728x90