준비하는 대학생

[Design Pattern] Strategy Pattern(전략 패턴) 본문

Programming/Design pattern

[Design Pattern] Strategy Pattern(전략 패턴)

Bangii 2023. 3. 22. 11:31

Strategy pattern 이란?

Strategy pattern은 객체지향 디자인 패턴 중 하나로, 동일한 문제를 해결하는 여러 알고리즘 중에서 필요에 따라 적합한 알고리즘을 선택하여 사용할 수 있도록 하는 패턴입니다.

이 패턴을 사용하면 알고리즘과 클라이언트 코드가 독립적으로 변화할 수 있으며, 새로운 알고리즘을 추가하거나 기존 알고리즘을 변경하더라도 클라이언트 코드를 수정하지 않아도 되는 장점이 있습니다.

Strategy pattern 구현 방법

Strategy pattern을 구현하는 방법은 다음과 같습니다.

  1. 알고리즘을 캡슐화한 인터페이스를 정의합니다.
  2. 각각의 알고리즘을 구현하는 클래스를 작성합니다.
  3. 클라이언트 코드에서 필요에 따라 적절한 알고리즘을 선택하여 사용합니다.

자바 예시 코드

예를 들어, 상품의 가격을 계산하는 프로그램을 작성한다고 가정해봅시다. 이 프로그램에서는 상품의 가격을 계산하는 방법이 여러 가지일 수 있습니다. 예를 들어, 상품 가격에 대한 세금이 다르거나, 할인을 적용하는 방법이 다를 수 있습니다. 이러한 경우에는 Strategy pattern을 사용하여 알고리즘을 독립적으로 구현하고, 클라이언트 코드에서 적절한 알고리즘을 선택하여 사용할 수 있습니다.

우선, 상품 가격을 계산하는 인터페이스를 정의합니다.

public interface PriceCalculator {
    double calculate(double price);
}

다음으로, 상품 가격에 대한 세금을 계산하는 알고리즘과 할인을 적용하는 알고리즘을 구현하는 클래스를 작성합니다.

public class TaxCalculator implements PriceCalculator {
    @Override
    public double calculate(double price) {
        return price * 1.1;
    }
}
public class DiscountCalculator implements PriceCalculator {
    @Override
    public double calculate(double price) {
        return price * 0.9;
    }
}

마지막으로, 클라이언트 코드에서는 필요에 따라 적절한 알고리즘을 선택하여 사용합니다.

package study.strategyPattern;

public class Main {
    public static void main(String[] args) {
        double price = 100.0;
        PriceCalculator calculator = new TaxCalculator();
        double result = calculator.calculate(price);
        System.out.println("Price with tax: " + result);
        calculator = new DiscountCalculator();
        result = calculator.calculate(price);
        System.out.println("Price with discount: " + result);
    }
}


위 코드에서는 `PriceCalculator` 인터페이스를 구현한 `TaxCalculator` 클래스와 `DiscountCalculator` 클래스를 구현합니다. 각각 `calculate` 메소드를 구현하여 상품 가격에 대한 세금과 할인을 계산합니다. 또한, `Main` 클래스에서는 필요에 따라 적절한 알고리즘을 선택하여 사용합니다. 예를 들어, `TaxCalculator`를 사용하면 상품 가격에 대한 세금이 적용된 결과를 얻을 수 있고, `DiscountCalculator`를 사용하면 상품 가격에 대한 할인이 적용된 결과를 얻을 수 있습니다.

이처럼 Strategy pattern은 알고리즘을 독립적으로 구현하고, 클라이언트 코드에서 필요에 따라 선택하여 사용할 수 있도록 하는 패턴입니다. 이를 사용하면 알고리즘과 클라이언트 코드가 독립적으로 변화할 수 있어 유지보수와 확장성이 용이하며, 코드의 재사용성도 높일 수 있습니다.

Strategy pattern 장단점

장점

  • 알고리즘과 클라이언트 코드가 독립적으로 변화할 수 있어 유지보수와 확장성이 용이합니다.
  • 새로운 알고리즘을 추가하거나 기존 알고리즘을 변경하더라도 클라이언트 코드를 수정하지 않아도 됩니다.
  • 코드의 재사용성이 높아집니다.

단점

  • Strategy 객체를 생성하고 관리하는 데 추가적인 비용이 발생할 수 있습니다.
  • 클라이언트 코드에서 적절한 알고리즘을 선택하는 로직이 복잡해질 수 있습니다.

Strategy pattern vs Template method pattern

Strategy pattern과 Template method pattern은 둘 다 알고리즘을 다루는 패턴입니다. 그러나 둘의 차이점은 다음과 같습니다.

  • Strategy pattern은 알고리즘을 독립적으로 구현하고, 클라이언트 코드에서 필요에 따라 선택하여 사용할 수 있도록 하는 패턴입니다.
  • Template method pattern은 알고리즘의 구체적인 구현 방법을 상위 클래스에서 정의하고, 하위 클래스에서 구체적인 구현을 수행하는 패턴입니다.

즉, Strategy pattern은 알고리즘을 선택하는 것에 중점을 두고, Template method pattern은 알고리즘의 구체적인 구현 방법에 중점을 둡니다.

결론

Strategy pattern은 알고리즘을 독립적으로 구현하고, 클라이언트 코드에서 필요에 따라 선택하여 사용할 수 있도록 하는 패턴입니다. 이를 사용하면 알고리즘과 클라이언트 코드가 독립적으로 변화할 수 있어 유지보수와 확장성이 용이하며, 코드의 재사용성도 높일 수 있습니다. 따라서, Strategy pattern은 유용한 디자인 패턴 중 하나입니다.

Comments