Strategyパターン
目的
様々なアルゴリズムを、それが発生するコンテキストに応じて使い分けられるようにする。問題
要求を行うクライアントや操作対象データによって、適用するアルゴリズムを選択する。問題例
方言のモードは設定可能
設定している方言によって出力を切り替える
パターン適用前
<?php class Client { public function anOperation() { $kyotoPerson = new DialectSpeaker(DialectSpeaker::KYOTO); $kyotoPerson->sayWelcome(); $kyotoPerson->sayThanks(); } }
<?php class DialectSpeaker { const KYOTO = 1; const NAGOYA = 2; /** * @var int */ private $dialect; /** * DialectSpeaker constructor. * @param $dialect */ public function __construct(int $dialect) { $this->dialect = $dialect; } public function sayWelcome() { switch ($this->dialect) { case self::KYOTO : echo "おいでやす"; break; case self::NAGOYA : echo "いりゃあせ"; break; } } public function sayThanks() { switch ($this->dialect) { case self::KYOTO : echo "おおきに"; break; case self::NAGOYA : echo "ありがとう"; break; } } }
パターン適用
ストラテジーパターンを適用する前に、どの部分がストラテジー、アルゴリズムに当たるのかを考える必要がある。
<?php interface Dialect { public function sayWelcome(): void; public function sayThanks(): void; }
<?php class KyotoDialect implements Dialect { public function sayWelcome(): void { echo "おいでやす"; } public function sayThanks(): void { echo "おおきに"; } }
<?php class NagoyaDialect implements Dialect { public function sayWelcome(): void { echo "いりゃあせ"; } public function sayThanks(): void { echo "ありがとう"; } }
<?php class DialectSpeaker { const KYOTO = 1; const NAGOYA = 2; /** * @var Dialect */ private $dialect; /** * DialectSpeaker constructor. * @param int $dialect */ public function __construct(int $dialect) { switch ($dialect) { case self::KYOTO : $this->dialect = new KyotoDialect(); break; case self::NAGOYA : $this->dialect = new NagoyaDialect(); break; } } public function sayWelcome() { $this->dialect->sayWelcome(); } public function sayThanks() { $this->dialect->sayThanks(); } }
パターンを適用したことにより、実際の処理はDialectインターフェースを実装したKyotoDialect, NagoyaDialectクラスのメソッドによって実行される。
- メリット
- 条件文が複数から1つになる 方言を見て種類を切り替えるswitch文がDialectSpeakerクラス内のsayWelcome()とsayThanks()メソッドの2箇所に存在していた。 もしsayGoodBye()というメソッドを新たに追加した場合、switch文が増えることになる。それに対して、パターン適用後は、方言の種類を見て処理を切り替える箇所は、DialectSpeakerクラスのコンストラクタの1箇所のみ。
- 方言による処理がひとまとまりになる
方言を戦略(アルゴリズム)と捉え、これを別クラスにしたことで、方言の具体的な処理をサブクラスに記述できる。京都弁に問題があったら、KyotoDialectを修正するだけで済む。
オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)
- 作者: アラン・シャロウェイ,ジェームズ・R・トロット,村上雅章
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
- 作者: 結城浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2004/06/19
- メディア: 大型本
- 購入: 51人 クリック: 762回
- この商品を含むブログ (397件) を見る
Javaデザインパターン徹底攻略 (標準プログラマーズライブラリ)
- 作者: 日立ソフトウェアエンジニアリングインターネットビジネス部
- 出版社/メーカー: 技術評論社
- 発売日: 2002/09
- メディア: 単行本
- 購入: 7人 クリック: 33回
- この商品を含むブログ (24件) を見る
- 作者: 株式会社テクノロジックアート,長瀬嘉秀
- 出版社/メーカー: 翔泳社
- 発売日: 2004/01/24
- メディア: 単行本
- 購入: 1人 クリック: 157回
- この商品を含むブログ (5件) を見る