티스토리 뷰

전략 패턴이란?

전략 패턴은 알고리즘의 패밀리를 정의해 캡슐화하고 서로 교환 가능하게 하는 패턴이다. 따라서, 런타임 중에 알고리즘 전략을 선택해 객체 동작을 실시간으로 바뀌도록 할 수 있게 한다.  어떤 일을 수행하는 알고리즘이 여러가지일때 알고리즘 변형이 빈번하게 필요한 경우에 적합하다. 

전략 패턴 사용 법

  • ConcreteStarategy: 알고리즘, 행위, 동작을 객체로 정의한 구현체
  • Strategy 인터페이스 : 모든 전략 구현제에 대한 상위 인터페이스
  • Context : 알고리즘을 실행해야 할 때마다 해당 알고리즘과 연결된 전략 객체의 메소드를 호출.
  • 클라이언트 : 특정 전략 객체를 컨텍스트에 전달 함으로써 전략을 등록하거나 변경하여 전략 알고리즘을 실행한 결과를 누린다.
// 전략(추상화된 알고리즘)
interface Strategy {
    void strategyMethod();
}

// 전략 알고리즘 1
class ConcreteStratey1 implements Strategy {
    public void strategyMethod() {}
}

// 전략 알고리즘 2
class ConcreteStratey2 implements Strategy {
    public void strategyMethod() {}
}

//전략 알고리즘 3
class ConcreteStratey3 implements Strategy {
    public void strategyMethod() {}
}
// 컨텍스트(전략 등록/실행)
class Context {
    Strategy Strategy; // 전략 인터페이스를 합성(composition)
	
    // 전략 교체 메소드
    void setStrategy(Strategy Strategy) {
        this.Strategy = Strategy;
    }
	
    // 전략 실행 메소드
    void contextMethod() {
        this.Strategy.strategyMethod();
    }
}
// 클라이언트(전략 교체/전략 실행한 결과를 얻음)
class Client {
    public static void main(String[] args) {
        // 1. 컨텍스트 생성
        Context c = new Context();

        // 2. 전략 설정
        c.setStrategy(new ConcreteStratey1());

        // 3. 전략 실행
        c.strategyMethod();

        // 4. 다른 전략 설정
        c.setStrategy(new ConcreteStratey2());

        // 5. 다른 전략 시행
        c.strategyMethod();
    }
}

패턴 사용 시기

  • 알고리즘 코드가 노출되어서는 안 되는 데이터에 액세스하거나 데이터를 활용할 때
  • 알고리즘의 동작이 런타임에 교체되어야 할 떄

패턴 장점

Solid 원칙의 OCP원칙, DIP원칙과 합성, 다형성, 캡슐화 등 OOP기술의 총 집합 버전!!

패턴 단점

  • 알고리즘이 많아질수록 관리해야 할 객체의 수가 늘어난다.
  • 적절한 전략을 선택하기 위해 전략 간의 차이점을 파악하고 있어야 한다.

전략 패턴 vs 템플리 메소드 패턴

  전략 패턴 템플릿 메소드 패턴
공통점 알고리즘을 때에 따라 적용한다.
OCP원칙을 충족한다.
차이점 위임을 통해 상속을 통해
객체 간의 결합이 느슨 두 모듈이 더 밀접하게 결합
주로 인터페이스를 사용 주로 추상 클래스나 구체적인 클래스를 사용
전체 전략 알고리즘을 변경  알고리즘의 일부만 변경

전략 패턴 vs 상태 패턴

  전략 패턴 상태 패턴
공통점 클래스 다이어그램과 코드 사용법이 유사
합성을 통해 상속의 한계를 극복
난잡한 조건 분기를 극복하기 위해 전략, 상태 형태를 객체화
객체의 일련의 행동이 캡슐화
(State는 Strategy의 확장으로 간주될 수 있음)
차이점 알고리즘을 객체화하여 클라이언트에서 유연적으로 전략을 제공/교체 객체의 상태를 객체화하여 클라이언트와 상태 클래스 내부에서 다른 상태로 교체를 한다.
전략 객체는 그 전략만의 알고리즘 동작을 정의 및 수행한다. (만일 전략을 상태화 하면 클래스 폭발이 일어날 수 있다 상태 객체는 상태가 적용되는 대상 객체가 할 수 있는 일련의 모든 행동들을 정의 및 수행한다.
전략 객체는 입력값에 따라 전략 형태가 다양하게 될 수 있으니 인스턴스로 구성한다. 상태 객체는 정의된 상태를 서로 스위칭 하기에 메모리 절약을 위해 싱글톤으로 구성한다.