Design Pattern

[디자인 패턴] 전략 패턴 (Strategy Pattern)

꾸준함. 2024. 7. 3. 21:32

전략 패턴

  • 여러 알고리즘을 캡슐화하고 상호 교환 가능하도록 지원하는 패턴으로써 코드의 유연성과 재사용성을 높일 수 있음
  • 다음과 같은 상황에서 유용함
    • 알고리즘이 다양할 때: 특정 기능의 구현이 다양하게 존재할 때 각 구현을 별도의 클래스로 분리
    • 알고리즘이 빈번히 변경될 때: 특정 기능의 구현이 자주 변경되거나 확장될 때 쉽게 변경.
    • 조건문을 대체할 때: 복잡한 조건문을 전략 패턴으로 대체하여 코드의 가독성을 높일 수 있음

 

https://www.geeksforgeeks.org/strategy-pattern-set-1/

 

주요 구성 요소

 

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의 디자인 패턴 - 백기선 강사님

반응형