PHPのストラテジーパターンとは?初心者向けにわかりやすく解説【デザインパターン入門】
生徒
「PHPのストラテジーパターンって何ですか?」
先生
「処理のやり方を後から自由に切り替えられる仕組みのことです。」
生徒
「処理を切り替えるってどういうことですか?」
先生
「例えば支払い方法をクレジットカードや現金で変えるようなイメージです。」
生徒
「なるほど!それをPHPで作るんですね!」
先生
「その通りです。基本から見ていきましょう!」
1. ストラテジーパターンとは?
PHPのストラテジーパターンとは、処理のアルゴリズム(やり方)をクラスとして分けて、あとから自由に切り替えられるようにするデザインパターンです。デザインパターンとは、プログラムのよくある設計方法の型のことです。
例えば「送料の計算方法」や「支払い方法」など、処理が複数ある場合に便利です。同じ処理の流れでも中身だけ変えたいときに使います。
2. なぜストラテジーパターンが必要?
初心者の方はif文で分岐すればいいと思うかもしれません。しかし条件が増えるとコードがどんどん複雑になります。
ストラテジーパターンを使うことで、コードが整理されて見やすくなり、修正や追加が簡単になります。これを保守性が高いと言います。
3. 基本構造を理解しよう
ストラテジーパターンは主に3つの要素で構成されます。
- ストラテジー(戦略)インターフェース
- 具体的な処理クラス
- コンテキスト(実行する側)
インターフェースとは、共通のルールのようなものです。
4. 簡単なサンプル(計算方法)
interface Strategy {
public function execute($a, $b);
}
class Add implements Strategy {
public function execute($a, $b) {
return $a + $b;
}
}
class Subtract implements Strategy {
public function execute($a, $b) {
return $a - $b;
}
}
この例では足し算と引き算の方法を切り替えられます。
5. 実行するクラス(コンテキスト)
class Calculator {
private $strategy;
public function setStrategy(Strategy $strategy) {
$this->strategy = $strategy;
}
public function calculate($a, $b) {
return $this->strategy->execute($a, $b);
}
}
どの計算方法を使うかを後から決められるのがポイントです。
6. 実際に使ってみる
$calc = new Calculator();
$calc->setStrategy(new Add());
echo $calc->calculate(5, 3);
$calc->setStrategy(new Subtract());
echo $calc->calculate(5, 3);
8
2
同じコードでも処理の中身を変更できます。
7. 実生活の例で理解する
ストラテジーパターンは身近な例で考えるとわかりやすいです。
例えば支払い方法です。
- 現金
- クレジットカード
- 電子マネー
どれも「支払う」という目的は同じですが、方法が違います。この違いをクラスで分けるのがストラテジーパターンです。
8. 別パターンの例(送料計算)
class NormalShipping implements Strategy {
public function execute($price, $weight) {
return $price + ($weight * 100);
}
}
class ExpressShipping implements Strategy {
public function execute($price, $weight) {
return $price + ($weight * 300);
}
}
配送方法によって料金計算を変えられます。
9. ストラテジーパターンのメリット
ストラテジーパターンを使うと多くのメリットがあります。
- コードが整理されて見やすい
- 新しい処理を簡単に追加できる
- if文の増加を防げる
特に初心者がつまずきやすい「コードのごちゃごちゃ」を防げるのが大きなポイントです。
まとめ
ストラテジーパターンの総復習
PHPのストラテジーパターンは、処理のアルゴリズムをクラスとして分離し、状況に応じて柔軟に切り替えることができるデザインパターンです。初心者の方にとっては少し難しく感じるかもしれませんが、基本の考え方はとてもシンプルです。同じ目的を持ちながら異なる処理方法を使い分けたい場合に非常に有効です。
例えば計算処理や送料計算、支払い方法など、処理内容は異なるものの共通のインターフェースで扱えるようにすることで、コードの再利用性が高まり、保守性も向上します。特にPHP初心者が陥りやすいif文の多用によるコードの複雑化を防ぐことができるため、実務でも非常に重要な考え方です。
ストラテジーパターンの重要ポイント
- 処理をクラスごとに分離することで見通しが良くなる
- インターフェースを使って共通ルールを作る
- コンテキストから処理を切り替えられる
- 機能追加時に既存コードを壊さずに拡張できる
応用的なサンプルコード
interface PaymentStrategy {
public function pay($amount);
}
class CreditCardPayment implements PaymentStrategy {
public function pay($amount) {
return "クレジットカードで" . $amount . "円支払いました";
}
}
class CashPayment implements PaymentStrategy {
public function pay($amount) {
return "現金で" . $amount . "円支払いました";
}
}
class PaymentContext {
private $strategy;
public function setStrategy(PaymentStrategy $strategy) {
$this->strategy = $strategy;
}
public function execute($amount) {
return $this->strategy->pay($amount);
}
}
$payment = new PaymentContext();
$payment->setStrategy(new CreditCardPayment());
echo $payment->execute(5000);
$payment->setStrategy(new CashPayment());
echo $payment->execute(3000);
このように、ストラテジーパターンを使うことで、支払い方法の追加や変更が簡単になります。例えば電子マネーや銀行振込を追加したい場合でも、新しいクラスを作るだけで対応可能です。既存のコードを変更する必要がないため、安全に機能拡張ができます。
初心者が理解すべきポイント
ストラテジーパターンを理解するためには、「処理を分ける」「共通ルールを作る」「後から差し替える」という三つの考え方を意識することが重要です。この考え方はPHPだけでなく、JavaやPythonなど他のプログラミング言語でも共通して使われています。
また、オブジェクト指向プログラミングの基礎である「カプセル化」「継承」「ポリモーフィズム」といった概念とも深く関わっています。これらを一緒に理解することで、より高度な設計ができるようになります。
実務での活用シーン
実際の開発現場では、ストラテジーパターンは非常に多くの場面で使われています。例えばECサイトの決済処理、送料計算、割引ロジック、ログ出力の方法切り替えなど、多くの場面で応用されています。
特に仕様変更が頻繁に発生するプロジェクトでは、ストラテジーパターンを使うことで柔軟な対応が可能になります。コードの変更範囲を最小限に抑えながら、新しい機能を追加できる点は大きなメリットです。
生徒
ストラテジーパターンは処理を切り替えられる仕組みだと理解できました
先生
その通りです同じ目的でも方法を自由に変えられるのが特徴です
生徒
インターフェースを使う理由も分かりました共通ルールがあると整理しやすいですね
先生
はい新しい機能を追加するときも既存コードを変更せずに済みます
生徒
if文が増えすぎる問題も解決できるのがいいですね
先生
その理解はとても重要です実務でもよく使うのでぜひ覚えておきましょう