17 13
第五章:万剑归宗 - 装饰器模式
V
•
阅读更多
第五章:万剑归宗 - 装饰器模式
武林秘籍
在编程江湖中,有一门绝世武功名为"万剑归宗",能够将无数剑法融为一体,威力无穷。
而在设计模式中,有一门与之对应的绝学——装饰器模式。
何为装饰器?
装饰器模式,就是动态地给对象添加额外的职责,而不改变其结构。
就像武林中的装备系统,给武器附加各种属性和效果。
武功心法
<?php
/**
* 万剑归宗 - 装饰器模式
* 层层叠加,威力无穷
*/
// 武器接口
interface Weapon {
public function attack();
public function getDescription();
}
// 具体组件 - 基础武器
class BasicSword implements Weapon {
public function attack() {
return "剑气攻击";
}
public function getDescription() {
return "普通长剑";
}
}
// 装饰器基类
abstract class WeaponDecorator implements Weapon {
protected $weapon;
public function __construct(Weapon $weapon) {
$this->weapon = $weapon;
}
public function attack() {
return $this->weapon->attack();
}
public function getDescription() {
return $this->weapon->getDescription();
}
}
// 火焰装饰器
class FireDecorator extends WeaponDecorator {
public function attack() {
return $this->weapon->attack() . " + 🔥 火焰伤害";
}
public function getDescription() {
return $this->weapon->getDescription() . " + 火焰附魔";
}
}
// 冰霜装饰器
class IceDecorator extends WeaponDecorator {
public function attack() {
return $this->weapon->attack() . " + ❄️ 冰霜伤害";
}
public function getDescription() {
return $this->weapon->getDescription() . " + 冰霜附魔";
}
}
// 雷电装饰器
class LightningDecorator extends WeaponDecorator {
public function attack() {
return $this->weapon->attack() . " + ⚡ 雷电伤害";
}
public function getDescription() {
return $this->weapon->getDescription() . " + 雷电附魔";
}
}
// 使用示例
echo "=== 万剑归宗 - 装饰器模式示例 ===\n";
// 创建基础武器
$basicSword = new BasicSword();
echo "基础武器:{$basicSword->getDescription()}\n";
echo "攻击效果:{$basicSword->attack()}\n";
// 添加火焰附魔
$fireSword = new FireDecorator($basicSword);
echo "\n火焰附魔后:{$fireSword->getDescription()}\n";
echo "攻击效果:{$fireSword->attack()}\n";
// 添加冰霜附魔
$iceFireSword = new IceDecorator($fireSword);
echo "\n冰霜+火焰附魔后:{$iceFireSword->getDescription()}\n";
echo "攻击效果:{$iceFireSword->attack()}\n";
// 添加雷电附魔(万剑归宗!)
$ultimateSword = new LightningDecorator($iceFireSword);
echo "\n万剑归宗(冰霜+火焰+雷电):{$ultimateSword->getDescription()}\n";
echo "攻击效果:{$ultimateSword->attack()}\n";
// 验证原武器未改变
echo "\n原基础武器未改变:{$basicSword->getDescription()}\n";
echo "攻击效果:{$basicSword->attack()}\n";
?>
江湖应用
武器强化 - 如同武林中的装备附魔
功能扩展 - 如同武林中的招式叠加
动态配置 - 如同武林中的变化万千
万剑归宗要诀
层层叠加:装饰器可以多层嵌套
灵活扩展:不改变原有对象,动态添加功能
组合自由:可以自由组合不同的装饰器
修炼要点
装饰器接口:与组件接口一致
组合关系:装饰器持有组件对象
透明性:客户端无需关心装饰细节
下回预告:第六章:乾坤大挪移 - 适配器模式
本文章由设计模式武侠传系列发布