PHP5でデザインパターン − Strategyパターン

「HeadFirstデザインパターン」を見ながら、お勉強です。まずはStrategyパターン。
間違いやツッコミどころがあるかも知れませんがご了承のほどを。

http://studio-m.heteml.jp/pattern/strategy/fighter/class.gif

こんな感じでいいのかな。武器クラスとそれを持つキャラクタークラスで構成します。

まずは、武器の抽象クラスとそれを実装するサブクラス(斧クラスと剣クラス)。

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デザインパターン ―頭とからだで覚えるデザインパターンの基本

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本