행동(알고리즘)을 캡술화하고 이를 동적으로 변경할 수 있도록 하는 디자인 패턴이다.
실행 중에 알고리즘을 선택하거나 교체할 수 있도록 한다.
// 전략 인터페이스
public interface PaymentStrategy {
void pay(int amount);
}
// 신용카드 결제 전략
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println(amount + "원을 신용카드(" + cardNumber + ")로 결제했습니다.");
}
}
// 페이팔 결제 전략
public class PayPalPayment implements PaymentStrategy {
private String email;
public PayPalPayment(String email) {
this.email = email;
}
@Override
public void pay(int amount) {
System.out.println(amount + "원을 PayPal(" + email + ")로 결제했습니다.");
}
}
// 결제 처리 컨텍스트
public class PaymentContext {
private PaymentStrategy paymentStrategy;
// 전략을 동적으로 변경 가능
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void pay(int amount) {
if (paymentStrategy == null) {
System.out.println("결제 방법이 선택되지 않았습니다.");
return;
}
paymentStrategy.pay(amount);
}
}
public class StrategyPatternExample {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 신용카드로 결제
context.setPaymentStrategy(new CreditCardPayment("1234-5678-9876-5432"));
context.pay(10000);
// PayPal로 결제
context.setPaymentStrategy(new PayPalPayment("user@example.com"));
context.pay(20000);
}
}
Comparator를 사용하여 정렬 기준을 다르게 적용.