Strategy 패턴은 특정 작업을 처리하는 여러 알고리즘을 적용하고, 상황에 따라 그 중 하나를 쉽게 바꿔쓸 수 있도록 합니다.

// Strategy 인터페이스
interface PaymentStrategy {
void pay(int amount);
}
// ConcreteStrategy 클래스
class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
public CreditCardStrategy(String name, String cardNumber) {
this.name = name;
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid with credit card.");
}
}
class PayPalStrategy implements PaymentStrategy {
private String emailId;
public PayPalStrategy(String emailId) {
this.emailId = emailId;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using PayPal.");
}
}
PayPalStrategy 와 CreditCardStrategy 는 PaymentStrategy 인터페이스를 구현하고 있음// Context 클래스
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void pay(int amount) {
paymentStrategy.pay(amount);
}
}
ShoppingCart 는 추상화인 PaymentStrategy 에 의존하고 있음ShoppingCart 는 paymentStrategy 에 pay 를 위임하고 있음public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardStrategy("John Doe", "1234567890123456"));
cart.pay(100); // 신용 카드로 결제
cart.setPaymentStrategy(new PayPalStrategy("john@example.com"));
cart.pay(200); // 페이팔로 결제
}
}
Client는 필요에 따라 다른 PaymentStrategy를 설정해 결제 방식을 쉽게 바꿀 수 있음