전략 패턴
- 여러 알고리즘을 캡슐화하고 상호 교환 가능하도록 지원하는 패턴으로써 코드의 유연성과 재사용성을 높일 수 있음
- 다음과 같은 상황에서 유용함
- 알고리즘이 다양할 때: 특정 기능의 구현이 다양하게 존재할 때 각 구현을 별도의 클래스로 분리
- 알고리즘이 빈번히 변경될 때: 특정 기능의 구현이 자주 변경되거나 확장될 때 쉽게 변경.
- 조건문을 대체할 때: 복잡한 조건문을 전략 패턴으로 대체하여 코드의 가독성을 높일 수 있음
주요 구성 요소
1. Context
- 전략을 사용하는 클래스
2. Strategy
- 다양한 전략의 공통 메서드를 정의
3. ConcreteStategy
- 구체적인 전략 구현체
전략 패턴 구현 예시
- 클라이언트가 필요에 따라 정렬 알고리즘을 변경하는 예시
1. Strategy
2. ConcreteStrategy
3. Context
4. 클라이언트 코드
전략 패턴 장단점
장점
- 새로운 전략을 추가하더라도 기존 코드를 변경하지 않아도 됨 (SOLID의 OCP 원칙)
- 상속 대신 위임을 사용할 수 있음
- 공통된 전략 인터페이스를 통해 다양한 알고리즘을 재사용
- 런타임에 전략을 변경할 수 있음
단점
- 새로운 전략마다 클래스를 추가해야 하므로 클래스 수에 비례하여 관리 포인트 및 복잡성 증가
- 클라이언트 코드에서 구체적인 전략을 선택하고 설정해야 하는 책임이 추가됨
실무에서 쓰이는 전략 패턴
1. 자바 Comparator
- Comparator를 사용하면 객체의 정렬 순서를 정의하는 다양한 전략을 캡슐화할 수 있으며 이를 통해 동일한 객체 집합에 대해 여러 가지 정렬 방법을 사용할 수 있음
- Comparator 인터페이스는 전략 패턴의 Strategy 역할
- 다양한 Comparator 구현체들은 ConcreteStrategy 역할
- 정렬 작업을 수행하는 클래스가 Context 역할
2. Spring 프레임워크의 ApplicationContext
- ApplicationContext는 다양한 객체의 생성과 관리, 그리고 종속성 주입을 담당하는 컨테이너
- Context: Spring에서 ApplicationContext는 전략을 사용하는 컨텍스트이며 다양한 전략을 사용하여 빈(bean)을 생성, 구성 및 관리
- Strategy: Spring의 빈 설정은 전략 인터페이스와 비슷한 역할을 수행하며 빈 설정 방법에 대한 인터페이스로, 다양한 구체적인 빈 설정 방법을 캡슐화
- ConcreteStrategy: Spring은 다양한 방식으로 빈을 설정할 수 있으며 각각의 방식은 구체적인 전략에 해당 (AnnotationConfigApplicationContext, ClassPathXmlApplicationContext, FileSystemXmlApplicationContext, etc.)
3. Spring 프레임워크의 PlatformTransactionManager
- PlatformTransactionManager는 애플리케이션에서 트랜잭션을 관리하는 중요한 인터페이스
- PlatformTransactionManager는 다양한 트랜잭션 관리 전략을 캡슐화하고, 이를 필요에 따라 교체하거나 사용할 수 있도록 설계됨
- Context:트랜잭션 관리가 필요한 애플리케이션 코드나 서비스
- Strategy: PlatformTransactionManager 인터페이스: 다양한 트랜잭션 관리 방법의 공통 인터페이스를 정의
- Concrete Strategy: DataSourceTransactionManager, JtaTransactionManager, HibernateTransactionManager 등 다양한 트랜잭션 관리 구현체
참고
코딩으로 학습하는 GoF의 디자인 패턴 - 백기선 강사님
반응형
'Design Pattern' 카테고리의 다른 글
[디자인 패턴] 방문자 패턴 (Visitor Pattern) (0) | 2024.07.05 |
---|---|
[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern) (0) | 2024.07.03 |
[디자인 패턴] 상태 패턴 (State Pattern) (0) | 2024.07.03 |
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2024.07.02 |
[디자인 패턴] 메멘토 패턴 (Memento Pattern) (1) | 2024.06.30 |