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

예시 코드
@Setter@AllArgsConstructorpublic 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) = 4000Coupon.discount(5000) = 4500
쿠폰 객체를 만들어 Strategy를 주입해주면 전략을 바꿈에 따라 다른 로직이 적용되는 것을 볼 수 있다.
이 링크로 가면 코드를 볼 수 있다.