アダプターパターン(委譲)

 委譲を利用したアダプターパターンは、新しい要求やインターフェースを持つコードを、既存のコードにシームレスに統合する方法です。
このページでは、新しいプレイヤー(Player)クラスが既存のプレイヤー(LegacyPlayer)クラスを委譲して、新しい戦闘インターフェースに適合させる方法を示しています。

Player(新しいプレイヤー)
 このクラスは新しい戦闘インターフェースである「BattleAble」を実装しています。
しかし、実際の攻撃行動は古い「LegacyPlayer」クラスに委譲されます。
これにより、新しい要求に適合させつつ、既存のコードを再利用することができます。
Enemy(敵)
 敵のクラスも同じ「BattleAble」インターフェースを実装し、アプリケーション内で統一的な戦闘インターフェースを提供します。
これにより、異なるキャラクター間で同じ戦闘プロセスを共有できます。

 このサンプルは、委譲を利用したアダプターパターンを使用して、新しい機能を既存のコードに統合する方法を示しています。
アプリケーションの柔軟性と保守性が向上し、新しい要求に対応するプロセスが簡素化されます。

<?php

interface BattleAble
{
    public function attack(): void;

    public function defense(): void;

    public function escape(): void;
}
                    
<?php

class Enemy implements BattleAble
{
    public function attack(): void
    {
        echo '敵の攻撃!' . PHP_EOL;
    }

    public function defence(): void
    {
        echo '敵の防御!' . PHP_EOL;
    }

    public function escape(): void
    {
        echo '敵の逃走!' . PHP_EOL;
    }
}
                    
<?php

class LegacyPlayer
{
    public function legacyAttack(): void
    {
        echo 'プレイヤーの攻撃!' . PHP_EOL;
    }

    public function legacyBadAction(): void
    {
        // 読みたくもない悪いコード
    }

    public function legacyFoolishAction(): void
    {
        // 触れたらバグるコード
    }

    public function legacyTerribleAction(): void
    {
        // 関わったら三ヶ月は定時で帰れなくなるコード
    }
}
                    
<?php

class Player implements BattleAble
{
    private LegacyPlayer $legacyPlayer;

    public function __construct(LegacyPlayer $legacyPlayer)
    {
        $this->legacyPlayer = $legacyPlayer;
    }

    public function attack(): void
    {
        $this->legacyPlayer->legacyAttack();
    }

    public function defense(): void
    {
        echo 'プレイヤーの防御!' . PHP_EOL;
    }

    public function escape(): void
    {
        echo 'プレイヤーの逃走!' . PHP_EOL;
    }
}
                    
<?php

$player = new Player(new LegacyPlayer);
$player->attack(); // プレイヤーの攻撃!

$enemy = new Enemy();
$enemy->attack(); // 敵の攻撃!