코드/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