PHP5でデザインパターン − Strategyパターン
「HeadFirstデザインパターン」を見ながら、お勉強です。まずはStrategyパターン。
間違いやツッコミどころがあるかも知れませんがご了承のほどを。
こんな感じでいいのかな。武器クラスとそれを持つキャラクタークラスで構成します。
まずは、武器の抽象クラスとそれを実装するサブクラス(斧クラスと剣クラス)。
Weapon.php
<?php /** * Stategyパターンによる武器の実装 */ /** * 武器の抽象クラス */ abstract class Weapon { protected $name; public function getName() { return $this->name; } abstract public function attack(); } /** * 斧クラス */ class Axe extends Weapon { protected $name = '斧'; public function attack() { echo $this->name."を振り下ろした!<br><br>\n"; } } /** * 剣クラス */ class Sword extends Weapon { protected $name = '剣'; public function attack() { echo $this->name."で斬りつけた!<br><br>\n"; } }
次に、武器を持つキャラクターの抽象クラスと、それを実装するサブクラス(戦士クラス)。
Character.php
<?php /** * Strategyパターンによるキャラクターの実装 */ require_once 'Weapon.php'; /** * キャラクターの抽象クラス */ abstract class Character { protected $name; protected $weapon; public function attack() { echo $this->name."の攻撃!<br>\n"; $this->weapon->attack(); } public function setWeapon($weapon) { $this->weapon = $weapon; echo $this->name."は、".$weapon->getName()."を装備した。<br>\n"; } } /** * 戦士クラス */ class Fighter extends Character { protected $name = '戦士'; }
そして、戦士クラスのインスタンスを作成し、それぞれの武器を使用するテストスクリプト。
fighterTest.php
<?php /** * Strategyパターンのテスト */ require_once 'Character.php'; $mychr = new Fighter(); // 剣を装備して攻撃 $mychr->setWeapon(new Sword()); $mychr->attack(); // 斧を装備して攻撃 $mychr->setWeapon(new Axe()); $mychr->attack();
実際の動作結果はこちら。
テストスクリプトの実行時にアルゴリズム(この場合は武器)を切り替えて実行しています。
Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本
- 作者: Eric Freeman,Elisabeth Freeman,Kathy Sierra,Bert Bates,佐藤直生,木下哲也,有限会社福龍興業
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/12/02
- メディア: 大型本
- 購入: 14人 クリック: 362回
- この商品を含むブログ (98件) を見る