Intro::
전략패턴에 대한 정리본 입니다.
전략 패턴(Strategy Pattern)의 개념
•
하나의 기능(행동, 알고리즘을 여러 방식으로 구현해야 할 때, 각 방식(전략)을 별도의 클래스로 분리하고 이를 인터페이스를 통해 일관되게 사용하도록 구성합니다.
•
클라이언트는 전략 객체를 직접 사용하지 않고, 인터페이스를 통해 추상화된 전략을 사용함으로써 코드 변경 없이 전략을 쉽게 교체할 수 있습니다.
1. 할인 전략(Discount Strategy) 인터페이스 정의
먼저, 할인 전략을 공통으로 사용하는 인터페이스를 정의합니다. 모든 할인 정책은 calculateDiscountedPrice 메서드를 통해 정가에서 할인된 가격을 계산합니다.
ublic interface DiscountStrategy {
/**
* 정가에서 할인율을 적용하여 할인된 가격을 계산하는 메서드.
* @param price 정가
* @return 할인 적용 후 가격
*/
double calculateDiscountedPrice(double price);
}
Java
복사
2. 구체적인 할인 전략 클래스 구현
각 클래스는 DiscountStrategy 인터페이스를 구현하여 자신의 할인 로직을 정의합니다.
2.1. 할인 없음(NoDiscountStrategy)
할인 정책이 없는 경우를 위한 전략입니다.
public class NoDiscountStrategy implements DiscountStrategy {
@Override
public double calculateDiscountedPrice(double price) {
// 할인 없음: 정가 그대로 반환
return price;
}
}
Java
복사
2.2. 일반 할인(RegularDiscountStrategy)
예를 들어, 일반 고객에게 10% 할인을 적용하는 전략입니다.
public class RegularDiscountStrategy implements DiscountStrategy {
private final double discountRate = 0.10; // 10% 할인
@Override
public double calculateDiscountedPrice(double price) {
return price * (1 - discountRate);
}
}
Java
복사
2.3. 프리미엄 할인(PremiumDiscountStrategy)
프리미엄 고객에게 20% 할인을 적용하는 전략입니다.
public class PremiumDiscountStrategy implements DiscountStrategy {
private final double discountRate = 0.20; // 20% 할인
@Override
public double calculateDiscountedPrice(double price) {
return price * (1 - discountRate);
}
}
Java
복사
3. Context 클래스: PriceCalculator
컨텍스트 클래스는 DiscountStrategy 인터페이스에 의존하여, 어떤 할인 전략을 사용할지 런타임에 결정할 수 있습니다.
public class PriceCalculator {
private DiscountStrategy discountStrategy;
// 할인 전략을 설정하는 메서드
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
// 설정된 할인 전략을 이용하여 할인된 가격 계산
public double getFinalPrice(double price) {
if (discountStrategy == null) {
throw new IllegalStateException("할인 전략이 설정되지 않았습니다.");
}
return discountStrategy.calculateDiscountedPrice(price);
}
}
Java
복사
4. 사용 예: Main 클래스에서 전략 교체
메인 클래스에서는 고객의 등급에 따라 PriceCalculator의 할인 전략을 변경하여 할인된 가격을 계산하는 과정을 보여줍니다.
public class Main {
public static void main(String[] args) {
PriceCalculator calculator = new PriceCalculator();
double originalPrice = 100000; // 예: 정가 100,000원
// 할인 전략이 없는 경우
calculator.setDiscountStrategy(new NoDiscountStrategy());
System.out.println("No Discount: " + calculator.getFinalPrice(originalPrice));
// 일반 고객 할인 적용
calculator.setDiscountStrategy(new RegularDiscountStrategy());
System.out.println("Regular Discount (10%): " + calculator.getFinalPrice(originalPrice));
// 프리미엄 고객 할인 적용
calculator.setDiscountStrategy(new PremiumDiscountStrategy());
System.out.println("Premium Discount (20%): " + calculator.getFinalPrice(originalPrice));
}
}
Java
복사
실행 결과는 아래와 같이 출력됩니다.
No Discount: 100000.0
Regular Discount (10%): 90000.0
Premium Discount (20%): 80000.0
Plain Text
복사
5. 상세 설명
•
인터페이스와 구체 전략:
DiscountStrategy 인터페이스를 통해 할인 계산 메서드를 정의하고, 각 구체 전략 클래스(NoDiscountStrategy, RegularDiscountStrategy, PremiumDiscountStrategy)는 서로 다른 할인 로직을 캡슐화합니다.
이를 통해 새로운 할인 정책이 추가되더라도 기존 코드를 수정하지 않고 새로운 클래스를 작성하여 확장할 수 있습니다.
•
컨텍스트 클래스(PriceCalculator):
PriceCalculator는 DiscountStrategy 인터페이스에 의존하여 할인 로직을 실행합니다.
클라이언트는 필요한 할인 전략을 런타임에 설정할 수 있으며, 이로 인해 코드가 유연해지고 유지보수가 쉬워집니다.
•
전략 패턴의 장점:
◦
유연성: 할인 정책을 객체로 분리하여, 상황에 맞게 전략을 변경할 수 있음.
◦
확장성: 새로운 할인 정책이 추가되더라도 기존 코드를 변경하지 않아도 됨.
◦
테스트 용이성: 각 할인 전략을 별도로 단위 테스트할 수 있어, 개별 알고리즘의 검증이 용이함.
6. 결론
전략 패턴은 여러 알고리즘(또는 정책)을 클래스별로 분리하여, 런타임에 필요에 따라 선택하거나 교체할 수 있게 해줍니다.
위 예제에서는 할인 정책을 통해 전략 패턴을 구체적으로 구현하였으며, 이를 통해 코드의 유연성과 유지보수성을 높이는 방법을 확인할 수 있습니다.