装饰器模式

背景

装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。

示例代码

// 英雄抽象类
abstract class Hero
{
    public function attack()
    {
        echo '攻击啊' . PHP_EOL;
    }

    public function defense()
    {
        echo '防守啊' . PHP_EOL;
    }

    public abstract function say();
}

// 盖伦
class GaiLun extends Hero
{
    public function attack()
    {
        echo '盖伦攻击' . PHP_EOL;
    }

    public function defense()
    {
        echo '盖伦防守' . PHP_EOL;
    }

    public function say()
    {
        echo '人在塔在' . PHP_EOL;
    }
}

// 皇子
class HuangZi extends Hero
{
    public function attack()
    {
        echo '皇子攻击' . PHP_EOL;
    }

    public function defense()
    {
        echo '皇子防守' . PHP_EOL;
    }

    public function say()
    {
        echo '犯我德邦者,虽远必诛' . PHP_EOL;
    }
}

// buff加成
class HeroBuff extends Hero
{
    public $hero;

    public function __construct(Hero $hero)
    {
        $this->hero =$hero;
    }

    public function attack()
    {
        $this->hero->attack();
    }

    public function defense()
    {
        $this->hero->defense();
    }

    public function say()
    {
        $this->hero->say();
    }
}

// 灼烧效果
class HeroBuffFire extends HeroBuff
{
    public function attack()
    {
        $this->hero->attack();
        echo '带有灼烧效果' . PHP_EOL;
    }
}

// 眩晕效果
class HeroBuffDizziness extends HeroBuff
{
    public function attack()
    {
        $this->hero->attack();
        echo '眩晕敌人' . PHP_EOL;
    }
}

$hero = new GaiLun(); // 实例化一个盖伦
$heroBuffFire = new HeroBuffFire($hero); // 给盖伦的攻击加上灼烧效果
$heroBuffDizziness = new HeroBuffDizziness($heroBuffFire); // 给盖伦的攻击加上眩晕效果
$heroBuffDizziness->attack(); // 盖伦开始攻击,并且攻击有灼烧和眩晕效果

posted @ 2022-08-28 21:32  whyly  阅读(28)  评论(0编辑  收藏  举报