Skip to content

전략 패턴은 프로그램이 진행되면서 캡슐화된 로직을 선택할 수 있게 하는 디자인 패턴이다. 로직 실행은 인터페이스에 의존을 시키고 인터페이스를 구현한 로직들을 전달해줌으로써 분기처리 없이 유연성을 갖출 수 있다. 객체지향 원칙중 개방-폐쇄 원칙(Open-Closed Principle)을 지키기 위한 디자인 패턴이다.


예시 코드

@Setter
@AllArgsConstructor
public class Coupon {
private DiscountStrategy discountStrategy;
public int discount(int price) {
return discountStrategy.execute(price);
}
}
public interface DiscountStrategy {
int execute(int price);
}

고정할인, 또는 비율할인을 할 수 있는 쿠폰 객체를 만들었다. 쿠폰이 DiscountStrategy 인터페이스를 구현한 클래스를 주입받아서 그 클래스에 구현되어있는 전략을 사용할 수 있도록 discount 메서드를 만들어줬다.


public class FixedDiscountStrategy implements DiscountStrategy {
@Override
public int execute(int price) {
return price - 1000;
}
}
public class RateDiscountStrategy implements DiscountStrategy {
@Override
public int execute(int price) {
return price - (int)(price * 0.1);
}
}

고정할인과 비율할인 전략을 구현한 두개의 클래스이다. 할인할 금액, 비율값은 상수로 설정해두었다.


public class App {
public static void main(String[] args) {
Coupon coupon = new Coupon(new FixedDiscountStrategy());
System.out.println("Coupon.discount(5000) = " + coupon.discount(5000));
coupon.setDiscountStrategy(new RateDiscountStrategy());
System.out.println("Coupon.discount(5000) = " + coupon.discount(5000));
}
}
//실행 결과
Coupon.discount(5000) = 4000
Coupon.discount(5000) = 4500

쿠폰 객체를 만들어 Strategy를 주입해주면 전략을 바꿈에 따라 다른 로직이 적용되는 것을 볼 수 있다.

링크로 가면 코드를 볼 수 있다.