디자인 패턴 & OOP

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

cloud-grace 2024. 6. 4. 21:18

전략 패턴(Strategy Pattern)이란?

전략 패턴은 디자인 패턴(Design Pattern)중 행위 패턴(Behavioral Pattern)이다.

 

행위 패턴 : 클래스나 객체들이 서로 상호작용하는 방법이나 어떤 알고리즘, 작업을 어떤 객체에 할당하는 것이 좋을지 정의하는 패턴이다. 즉, 객체나 클래스의 교류 방법에 대해 정의하는 것이다. 하나의 객체만으로 수행할 수 없는 작업을 여러 객체로 나누면서 결합도를 최소화하게 해준다. 행위 클래스 패턴은 상속을 통해 알고리즘, 제어 흐름을 기술하고, 행위 객체 해턴은 하나의 작업을 수행하기 위해 객체 집합이 어떻게 협력하는지를 기술한다.

 

GoF 디자인 패턴에 의하면 전략 패턴은 동일 계열의 알고리즘군을 정의하고 캡슐화하여 상호 교환이 가능하도록 한다.

 

전략 패턴 : 실행(Runtime) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 패턴이다. 알고리즘을 정의하고, 캡슐화하며, 실행 시간에 서로 교환 가능하도록 만든다.

 

전략 패턴은 알고리즘 변형이나 확장을 쉽게 할 수 있고, 객체 간의 결합도를 낮출 수 있다. 따라서 알고리즘 변경에 따라 코드 변경을 최소화할 수 있다. 즉, 어떤 일을 수행하는 알고리즘이 여러가지일 때, 동작들을 미리 전략으로 정의하고 손쉽게 전략을 바꿀 수 있으며, 알고리즘 변형을 자주 일으킬 경우에 적합하다.

 

전략 패턴 구조

출처 : https://velog.io/@y_dragonrise/

  • Strategy : 모든 전략 구현체에 대한 공용 인터페이스이다. 알고리즘이 추상화되어 있다.
  • ConcreteStrategy : 알고리즘, 행위, 동작을 객체로 정의한 구현체이다.
  • Context : 알고리즘을 수행할 때마다 각각 알고리즘과 연결된 전략 객체 메소드를 호출한다.
  • Client : 특정 전략 객체를 컨텍스트에 전달하면서 전략을 등록하고 변경하며 각각의 전략 알고리즘 수행 결과를 도출한다.

 

전략 패턴 예제 코드

  • Strategy Interface : Context Class에서 사용하는 전략 인터페이스이다.
// Strategy interface
public interface Strategy {
    public int execute(int num1, int num2);
}
  • Concrete Strategy : AddOperation(), SubtractOperation(), MultiplyOperation() 클래스들은 execute() 메서드를 구현하여 각각 정수를 계산한다.
// Concrete Strategy: Addition
public class AddOperation implements Strategy {
    @Override
    public int execute(int num1, int num2) {
        return num1 + num2;
    }
}

// Concrete Strategy: Subtraction
public class SubtractOperation implements Strategy {
    @Override
    public int execute(int num1, int num2) {
        return num1 - num2;
    }
}

// Concrete Strategy: Multiplication
public class MultiplyOperation implements Strategy {
    @Override
    public int execute(int num1, int num2) {
        return num1 * num2;
    }
}
  • Context Class : 전략 선택을 수행하는 컨텍스트 클래스이다.
// Context class
public class Context {
    private Strategy strategy;

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

    public int executeStrategy(int num1, int num2) {
        return strategy.execute(num1, num2);
    }
}
  • Client : 전략 패턴을 사용하는 클라이언트 코드이다.
public class Client {
    public static void main(String[] args) {
        Strategy addOperation = new AddOperation(); // 전략 객체
        Strategy subtractOperation = new SubtractOperation();
        Strategy multiplyOperation = new MultiplyOperation();
        
        Context addContext = new Context(addOperation); // 컨택스트 객체
        System.out.println("10 + 5 = " + addContext.executeStrategy(10, 5)); // 연산 수행

        Context subtractContext = new Context(subtractOperation);
        System.out.println("10 - 5 = " + subtractContext.executeStrategy(10, 5));

        Context multiplyContext = new Context(multiplyOperation);
        System.out.println("10 * 5 = " + multiplyContext.executeStrategy(10, 5));
    }
}

 

전략 패턴의 장점

  • 코드 재사용성이 높고, 객체 간 결합도가 낮아지며 유지보수에 용이하다.
  • 알고리즘을 변형하고 확장하는 데에 용이하다
  • 테스트 수행에 용이하다.

 

 

 

참고 자료

https://brightstarit.tistory.com/39

https://shan0325.tistory.com/35

https://4z7l.github.io/2020/12/25/design_pattern_GoF.html

https://brightstarit.tistory.com/39