디자인 패턴

[Design Pattern] 전략 패턴

감자b 2024. 12. 25. 00:30

전략 패턴이란 알고리즘을 캡슐화하여 런타임 중 객체 동작을 동적으로 교체할 수 있도록 설계하는 디자인 패턴을 의미한다.

객체의 행위를 정의하는 알고리즘을 별도의 클래스로 분리, 이를 사용하는 객체(Context)가 특정 행동(Strategy)을 주입받아서 실행한다.


전략 패턴의 주요 구성 요소

 

1. Strategy(전략 인터페이스)

  • 알고리즘(행동)을 정의하는 공통 인터페이스.
  • 다양한 구체 전략(Concrete Strategies)들이 해당 인터페이스를 구현하여 각기 다른 알고리즘을 제공.
public interface Strategy {
    void execute();
}

 

 

2. ConcreteStrategy(구체적인 전략)

  • Strategy 인터페이스를 구현하며, 알고리즘(행동)을 정의.
class StrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("A execute");
    }
}

class StrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("B execute");
    }
}

 

 

3. Context(문맥)

  • Strategy 객체를 사용하여 행동을 실행하는 역할.
  • Strategy 객체를 외부에서 주입받아 동적으로 행동을 변경할 수 있음.
  • Context는 변하지 않는 부분, strategy 를 통해 일부 전략을 변경
public class Context {
    private final Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void execute() {
        start();
        strategy.execute();
        end();
    }

    private void start() {
        System.out.println("start");
    }

    private void end() {
        System.out.println("end");
    }
}

 

 

4. Client

  • 특정 전략(ConcreteStrategy)을 컨텍스트에 전달
  • 전략을 등록, 변경하는 역할을 한다.
public class Client {
    public static void main(String[] args) {
        Context contextA = new Context(new StrategyA());
        System.out.println("Executing StrategyA");
        contextA.executeTemplate();

        Context contextB = new Context(new StrategyB());
        System.out.println("Executing StrategyB");
        contextB.executeTemplate();
    }
}

 


전략 패턴의 장단점

장점

  • 캡슐화
    • 알고리즘(행동)을 별도의 클래스(ConcreteStrategy)로 분리하여 관리.
    • → Context의 변경 없이 알고리즘 확장, 교체 가능. (OCP 준수)
  • 프로그램 실행 중에 필요에 따라 적절한 전략을 선택하거나 교체할 수 있음.

단점

  • 알고리즘마다 별도의 클래스를 생성해야 하므로 복잡성이 증가
  • 클라이언트가 구체적인 전략을 알아야 한다.

여기서 의존성 주입을 활용하면 클라이언트가 구체 전략에 대해 알 필요가 없도록 구현 가능하다.


전략 패턴 vs 템플릿 메서드 패턴

 

[Design Pattern] 템플릿 메서드 패턴

템플릿 메서드 패턴이란 여러 클래스에서 공통으로 사용하는 메서드(변하지 않는 기능)를 템플릿이라는 상위 클래스에 정의하고 세부 동작을 하위 클래스에서 구현하도록 하는 패턴이다.Abstract

hbb-devlog.tistory.com

전략 패턴

  • 객체 구성(컴포지션)을 통해 알고리즘 변경
  • 주로 인터페이스 사용하므로 다중 상속이 가능
  • 런타임에 전략을 교체할 수 있음

템플릿 메서드 패턴

  • 상속을 통해 알고리즘 일부 변경
  • 주로 추상 클래스를 사용하므로 단일 상속만 가능, 템플릿에 알고리즘이 종속적
  • 상속 시점에 알고리즘 구조가 결정됨