戦略パターンの紹介
Strategy Pattern (Strategy Pattern) は、一連のアルゴリズムを定義し、各アルゴリズムを共通のインターフェイスを持つ個別のクラスにカプセル化する動作設計パターンです。戦略モードでは、実行時に必要に応じてアルゴリズムを相互に置き換えることができるため、コードの柔軟性と保守性が向上します。
例: 支払いシステム
Strategy パターンの適用例を示すために、簡単な支払いシステムを構築します。決済システムは、クレジットカード、Alipay、WeChat Pay などの複数の決済方法に対応しています。戦略パターンを使用して、これらの支払い方法を実装します。
まず、すべての支払い戦略のパブリック メソッドを定義する PaymentStrategy というインターフェイスを作成します。
public interface PaymentStrategy {
void pay(int amount);
}
次に、支払い方法ごとに PaymentStrategy インターフェイスを実装するクラスを作成します。
public class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
private String cvv;
private String expirationDate;
public CreditCardStrategy(String name, String cardNumber, String cvv, String expirationDate) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expirationDate = expirationDate;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid with credit card.");
}
}
public class AlipayStrategy implements PaymentStrategy {
private String email;
private String password;
public AlipayStrategy(String email, String password) {
this.email = email;
this.password = password;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid with Alipay.");
}
}
public class WeChatPayStrategy implements PaymentStrategy {
private String phoneNumber;
public WeChatPayStrategy(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid with WeChat Pay.");
}
}
次に、ShoppingCart というクラスを作成して、ショッピング カートをシミュレートします。ショッピング カートには、アイテムのリストと支払い方法が含まれます。
public class ShoppingCart {
private List<Item> items;
private PaymentStrategy paymentStrategy;
public ShoppingCart() {
this.items = new ArrayList<>();
}
public void addItem(Item item) {
items.add(item);
}
public void removeItem(Item item) {
items.remove(item);
}
public int calculateTotal() {
int total = 0;
for (Item item : items) {
total += item.getPrice();
}
return total;
}
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void pay() {
int amount = calculateTotal();
paymentStrategy.pay(amount);
}
}
最後に、メイン メソッドでショッピング カートのインスタンスを作成し、必要に応じて支払いポリシーを設定します。
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.addItem(new Item("Item1", 100));
cart.addItem(new Item("Item2", 150));
// 使用信用卡支付
cart.setPaymentStrategy(new CreditCardStrategy("John Doe", "1234567890123456", "123", "12/25"));
cart.pay();
// 使用支付宝支付
cart.setPaymentStrategy(new AlipayStrategy("[email protected]", "mypassword"));
cart.pay();
// 使用微信支付
cart.setPaymentStrategy(new WeChatPayStrategy("1234567890"));
cart.pay();
}
このコードを実行すると、ショッピング カートがさまざまな支払い戦略に従って支払いを行うことがわかります。
250 paid with credit card.
250 paid with Alipay.
250 paid with WeChat Pay.
戦略パターンを使用することで、ショッピング カートのコードを変更することなく、必要に応じて新しい支払い方法を簡単に追加できます。これにより、支払いシステムがより柔軟で保守しやすくなります。
要約する
戦略パターンは、一連のアルゴリズムを共通のインターフェースを持つ独立したクラスにカプセル化できる設計パターンです。これにより、実行時に必要に応じてアルゴリズムを柔軟に置き換えることができ、コードの柔軟性と保守性が向上します。この例では、戦略パターンを使用して複数の支払い方法を支払いシステムに追加する方法を示します。戦略パターンを使用することで、既存のコードを変更することなく、新しい支払い方法を簡単に追加できます。これにより、支払いシステムがより柔軟で保守しやすくなります。