装饰器模式
背景
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要的依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。
示例代码
// 英雄抽象类
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(); // 盖伦开始攻击,并且攻击有灼烧和眩晕效果