どうも、ちゃんなるです!
今回は、Strategy Patternを紹介します🖐️
概要
Strategy Patternは、異なるアルゴリズムや振る舞いを持つオブジェクトを、実行時に選択・交換できるようにするデザインパターンです🧠
これにより、コードの柔軟性が向上し、メンテナンスも容易になります。
今回示すプログラムの設計
オンラインショッピングサイトで利用できる異なる支払い方法(クレジットカード、PayPal、銀行振込)を実装してみましょう。
Strategy Patternを使って、決済方法を簡単に追加・変更できるようにします。
クラス図
クラス名 | 役割 |
---|---|
PaymentStrategy | 支払い方法を表すインターフェース |
CreditCardStrategy | クレジットカードでの支払い方法を実装するクラス |
PayPalStrategy | PayPalでの支払い方法を実装するクラス |
BankTransferStrategy | 銀行振込での支払い方法を実装するクラス |
ShoppingCart | 支払い方法を設定し、支払いを行うクラス |
サンプルコード
まず、支払い方法を表すインターフェースPaymentStrategy
を定義します。
interface PaymentStrategy { execute(): void; }
次に、異なる複数の支払い方法を実装するクラスを作成します。
class CreditCardStrategy implements PaymentStrategy { execute(): void { console.log("Paying with Credit Card"); } } class PayPalStrategy implements PaymentStrategy { execute(): void { console.log("Paying with PayPal"); } } class BankTransferStrategy implements PaymentStrategy { execute(): void { console.log("Paying with Bank Transfer"); } }
最後に、ShoppingCartクラスを作成し、支払い方法を付け替えれるようにするためにsetPaymentStrategy
関数を持たせます。
class ShoppingCart { private paymentStrategy: PaymentStrategy; setPaymentStrategy(strategy: PaymentStrategy): void { this.paymentStrategy = strategy; } pay(): void { this.paymentStrategy.execute(); } }
次のように様々な支払い方法(Strategy)を付け替えて実行することができます💰
const cart = new ShoppingCart(); cart.setPaymentStrategy(new CreditCardStrategy()); cart.pay(); // Paying with Credit Card cart.setPaymentStrategy(new PayPalStrategy()); cart.pay(); // Paying with PayPal
Strategy Patternの使い道
組み合わせられるデザインパターン
- Factory Method Pattern: オブジェクトの生成を専用のファクトリクラスに委譲することで、実行時に適切なストラテジオブジェクトを生成できます。
- Decorator Pattern: Strategy Patternと組み合わせることで、実行時に機能を追加・拡張することができます。例えば、支払い方法に特定の割引や手数料を追加する際に、Decorator Patternを使用して柔軟に機能を拡張できます。
- State Pattern: アルゴリズムや振る舞いがオブジェクトの状態に依存する場合、State Patternと組み合わせることで、状態遷移を柔軟に管理できます。例えば、支払いプロセスが複数のステップからなる場合、State Patternを使用して各ステップでの振る舞いを効果的に管理できます。
まとめ
Strategy Patternは、アルゴリズムや振る舞いを柔軟に変更できるようにするデザインパターンです🧠
この記事では、オンラインショッピングサイトでの支払い方法を例に、Strategy Patternの基本概念と実装方法を紹介しました🖐️
ぜひ、自社サービスにStrategy Patternを導入して、柔軟でメンテナンスしやすいアプリケーションを実現してください👍