JAVA/DesignPattern

Design Pattern 디자인 패턴 Startegy Pattern 전략 패턴

호두밥 2021. 12. 30. 20:37

Startegy Pattern 전략 패턴

행동 패턴으로, 런타임에 객체의 행동이나 알고리즘을 결정할 수 있는 패턴입니다.  

다양한 전략을 나타내는 객체와 전략 객체에 따라 행동이 다른 컨텍스트 객체를 생성합니다. 

Startegy Pattern 전략 패턴이 적합한 경우

  • 런타임에 객체의 기능이나 알고리즘을 변경하고 싶은 경우
  • 몇개의 행동(메소드)만 다른, 비슷한 객체가 많은 경우
  • 비즈니스 로직에서 분리하고 싶은 경우 
  • 클래스에 알고리즘이나 기능을 변환하기 위한 대량의 조건 연산이 있는 경우

장단점

장점

  • 런타임에 객체 내부의 알고리즘을 바꿀 수 있습니다.
  • 알고리즘을 사용하는 코드에서 알고리즘을 구현하는 세부 기능을 분리할 수 있습니다.
  • 합성(Composition)으로 상속(inheritance)을 대체할 수 있습니다.
  • 기존의 컨텍스트 객체를 수정하지 않고, 새로운 전략을 추가할 수 있습니다.  (단일책임원칙) 

단점

  • 알고리즘의 변경이 빈번하지 않다면, 패턴을 적용하는 것이 코드를 더 복잡하게 만들 수 있습니다.
  • 고객이 전략과 적절한 전략을 선택하는 것의 차이를 알아야만 합니다.
  • 많은 프로그래밍 언어들이 익명 함수 내부에 다른 버전의 다양한 버전의 알고리즘을 구현할 수 있도록 지원합니다. 전략 패턴을 쓰지 않고도 프로그래밍 언어 자체의 기능을 사용할 수 있습니다. 

*상속과 합성

2021.12.10 - [JAVA/JAVA] - 상속과 합성 Inheritance And Composition

Startegy Pattern 전략 패턴의 구현

전략 객체를 포함하는 컨텍스트 객체를 생성합니다. 그리고 컨텍스트 객체 내부의 전략 객체는 외부에서 주입받도록 합니다.  

Strategy

public interface Strategy {
    public int execute(int a, int b);
}

MultiplyStrategy

public class MultiplyStrategy implements Strategy{
    @Override
    public int execute(int a, int b) {
        return a*b;
    }
}

AddStrategy

public class AddStrategy implements Strategy {
    @Override
    public int execute(int a, int b) {
        return a+b;
    }
}

SubtractStrategy

public class SubtractStrategy implements Strategy{
    @Override
    public int execute(int a, int b) {
        return a-b;
    }
}

Context

public class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int execute(int a, int b){
        return strategy.execute(a,b);
    }
}

참조