设计模式武侠传 - 将设计模式比作武功秘籍

第五章:万剑归宗 - 装饰器模式
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"; ?> 江湖应用 武器强化 - 如同武林中的装备附魔 功能扩展 - 如同武林中的招式叠加 动态配置 - 如同武林中的变化万千 万剑归宗要诀 层层叠加:装饰器可以多层嵌套 灵活扩展:不改变原有对象,动态添加功能 组合自由:可以自由组合不同的装饰器 修炼要点 装饰器接口:与组件接口一致 组合关系:装饰器持有组件对象 透明性:客户端无需关心装饰细节 下回预告:第六章:乾坤大挪移 - 适配器模式 本文章由设计模式武侠传系列发布
阅读更多
<day6>面向对象编程——修真宗门的"组织架构"
V
修炼心法:面向对象的奥秘 在修真世界中,宗门、门派、家族都有自己的组织架构和传承体系。而在 PHP 修炼中,面向对象编程(OOP)正是实现这种组织架构的核心技术。 一、类与对象:宗门的蓝图与实例 1. 类的定义:宗门的蓝图 // 定义一个修真者类 class Cultivator { // 属性:修真者的基本信息 public $name; public $level; public $qi; // 方法:修真者的行为 public function __construct($name, $level, $qi) { $this->name = $name; $this->level = $level; $this->qi = $qi; } public function cultivate() { $this->qi += 10; echo "{$this->name}正在修炼,气值+10,当前气值:{$this->qi}\n"; } public function displayInfo() { echo "修真者:{$this->name}\n"; echo "境界:{$this->level}\n"; echo "气值:{$this->qi}\n"; } } 修真比喻:就像宗门的蓝图,定义了修真者的基本属性和行为。 2. 对象的创建:宗门的实例 // 创建修真者对象 $cultivator1 = new Cultivator("清风道人", "金丹期", 100); $cultivator2 = new Cultivator("明月仙子", "元婴期", 200); // 使用对象的方法 $cultivator1->cultivate(); $cultivator1->displayInfo(); $cultivator2->displayInfo(); 修真比喻:就像根据蓝图创建具体的修真者实例。 二、封装:保护宗门的传承 1. 访问修饰符 class SecretArt { private $secret; // 私有属性:只有宗门内部可见 protected $technique; // 受保护属性:宗门弟子可见 public $name; // 公共属性:所有人可见 public function __construct($name, $technique, $secret) { $this->name = $name; $this->technique = $technique; $this->secret = $secret; } // 公共方法:展示功法信息 public function showInfo() { echo "功法名称:{$this->name}\n"; echo "修炼技巧:{$this->technique}\n"; // 不能直接访问私有属性 $this->secret } // 私有方法:只有类内部可以调用 private function getSecret() { return $this->secret; } // 公共方法:通过公共接口访问私有数据 public function revealSecret() { return $this->getSecret(); } } 修真比喻:就像宗门的传承秘籍,有些内容只有核心弟子才能接触。 三、继承:宗门的传承体系 1. 基类与子类 // 基类:修真者 class Cultivator { public $name; public $level; public function __construct($name, $level) { $this->name = $name; $this->level = $level; } public function cultivate() { echo "{$this->name}正在修炼基础功法...\n"; } } // 子类:剑修 class SwordCultivator extends Cultivator { public $swordName; public function __construct($name, $level, $swordName) { parent::__construct($name, $level); $this->swordName = $swordName; } public function practiceSword() { echo "{$this->name}正在修炼{$this->swordName}剑法...\n"; } // 重写父类方法 public function cultivate() { parent::cultivate(); echo "同时修炼剑道心法...\n"; } } // 子类:法修 class MagicCultivator extends Cultivator { public $spellName; public function __construct($name, $level, $spellName) { parent::__construct($name, $level); $this->spellName = $spellName; } public function castSpell() { echo "{$this->name}施展{$this->spellName}法术...\n"; } } 修真比喻:就像宗门的传承体系,弟子继承师父的功法并发展自己的特色。 四、多态:万法归一 1. 接口与实现 // 接口:定义修真者的行为规范 interface CultivationMethod { public function cultivate(); public function displayInfo(); } // 实现接口的类 class QiCultivator implements CultivationMethod { public $name; public function __construct($name) { $this->name = $name; } public function cultivate() { echo "{$this->name}修炼气功,吐纳天地灵气...\n"; } public function displayInfo() { echo "气功修真者:{$this->name}\n"; } } class BodyCultivator implements CultivationMethod { public $name; public function __construct($name) { $this->name = $name; } public function cultivate() { echo "{$this->name}修炼体术,锤炼肉身...\n"; } public function displayInfo() { echo "体修修真者:{$this->name}\n"; } } 修真比喻:就像不同的修真道路,但都遵循修真的基本法则。 五、实战演练:修真宗门系统 <?php // 修真宗门系统 // 宗门类 class Sect { private $name; private $members = []; public function __construct($name) { $this->name = $name; } public function recruit($cultivator) { $this->members[] = $cultivator; echo "欢迎 {$cultivator->name} 加入 {$this->name}!\n"; } public function showMembers() { echo "=== {$this->name} 成员列表 ===\n"; foreach ($this->members as $member) { $member->displayInfo(); echo "---\n"; } } public function groupCultivate() { echo "=== {$this->name} 集体修炼 ===\n"; foreach ($this->members as $member) { $member->cultivate(); } } } // 创建宗门 $sect = new Sect("青云宗"); // 创建修真者 $cultivator1 = new SwordCultivator("清风道人", "金丹期", "青虹剑"); $cultivator2 = new MagicCultivator("明月仙子", "元婴期", "冰霜术"); $cultivator3 = new QiCultivator("玄天真人"); // 加入宗门 $sect->recruit($cultivator1); $sect->recruit($cultivator2); $sect->recruit($cultivator3); // 显示成员 $sect->showMembers(); // 集体修炼 $sect->groupCultivate(); // 个别修炼 $cultivator1->practiceSword(); $cultivator2->castSpell(); ?> 六、面向对象要点总结 类与对象: 类:对象的蓝图,定义属性和方法 对象:类的实例,具有具体的数据和行为 构造函数:对象创建时自动调用的方法 封装: public:公共属性/方法,所有地方都可访问 protected:受保护属性/方法,子类和本类可访问 private:私有属性/方法,只有本类可访问 继承: extends:子类继承父类的属性和方法 parent:::调用父类的方法 重写:子类可以重写父类的方法 多态: 接口:定义行为规范,不实现具体逻辑 实现:类实现接口,提供具体逻辑 同一接口,不同实现 七、今日修炼任务 创建一个Weapon武器类,包含名称、攻击力、耐久度属性 创建一个Cultivator修真者类,包含姓名、境界、气值属性 创建一个Sword剑类,继承自Weapon类,添加剑法技能 创建一个Sect宗门类,管理多个修真者 使用面向对象的方式模拟一场宗门大比 记住:面向对象编程是PHP修炼中的"组织架构"之术,熟练掌握它们,你就能构建更复杂的修真系统!
阅读更多
此版块下尚无主题。
何不尝试发布一个?