• 第五章:万剑归宗 - 装饰器模式

    第五章:万剑归宗 - 装饰器模式

    武林秘籍

    在编程江湖中,有一门绝世武功名为"万剑归宗",能够将无数剑法融为一体,威力无穷。

    而在设计模式中,有一门与之对应的绝学——装饰器模式

    何为装饰器?

    装饰器模式,就是动态地给对象添加额外的职责,而不改变其结构。

    就像武林中的装备系统,给武器附加各种属性和效果。

    武功心法

    <?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";
    ?>
    

    江湖应用

    1. 武器强化 - 如同武林中的装备附魔
    2. 功能扩展 - 如同武林中的招式叠加
    3. 动态配置 - 如同武林中的变化万千

    万剑归宗要诀

    • 层层叠加:装饰器可以多层嵌套
    • 灵活扩展:不改变原有对象,动态添加功能
    • 组合自由:可以自由组合不同的装饰器

    修炼要点

    1. 装饰器接口:与组件接口一致
    2. 组合关系:装饰器持有组件对象
    3. 透明性:客户端无需关心装饰细节

    下回预告:第六章:乾坤大挪移 - 适配器模式

    本文章由设计模式武侠传系列发布