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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace DesignPatternsPractice.Src.Structural.DecoratorPattern
{
    public class Decorator
    {
        // static void Main()
        // {
        //     // 创建服务对象  一个基础战士
        //     ICharacter baseWarrior = new BaseWarrior();

        //     Console.WriteLine($"这个{baseWarrior.GetDescription()}原本的 攻击力为{baseWarrior.GetAttack()}");
        //     // 加攻击力 buff
        //     baseWarrior = new StrengthBuff(baseWarrior);
        //     // 攻击力加成百分比 Buff
        //     baseWarrior = new WingBuff(baseWarrior);

        //     Console.WriteLine($"这个{baseWarrior.GetDescription()}现在的 攻击力为{baseWarrior.GetAttack()}");

        // }
    }

    // 抽象组件(角色接口)
    public interface ICharacter
    {
        int GetAttack();

        string GetDescription();
    }

    //具体角色
    public class BaseWarrior : ICharacter
    {
        public int GetAttack()
        {
            return 10;
        }

        public string GetDescription()
        {
            return "基础战士";
        }
    }

    // 装饰器抽象类
    public abstract class CharacterDecorator : ICharacter
    {
        protected ICharacter character;

        public CharacterDecorator(ICharacter character)
        {
            this.character = character;
        }
        public abstract  int GetAttack();

        public abstract string GetDescription();
    }

    // 具体装饰器1 加攻击力 buff
    public class StrengthBuff  : CharacterDecorator
    {
        public StrengthBuff (ICharacter character):base(character){}

        public override int GetAttack()
        {
           return (int) (character.GetAttack()+5);
        }

        public override string GetDescription()
        {
            return character.GetDescription()+"+ 力量Buff (+20%)";
        }
    }

    // 具体装饰器2:攻击力加成百分比 Buff
    public class WingBuff : CharacterDecorator
    {
        public WingBuff(ICharacter character) : base(character) { }

        public override int GetAttack()
        {
            return (int)(character.GetAttack() * 1.2);
        }

        public override string GetDescription()
        {
            return character.GetDescription() + " + 翅膀Buff(+20%)";
        }
    }

    // 具体装饰器3:狂暴Buff(双倍攻击)
    public class RageBuff : CharacterDecorator
    {
        public RageBuff(ICharacter character) : base(character) { }

        public override int GetAttack()
        {
            return character.GetAttack() * 2;
        }

        public override string GetDescription()
        {
            return character.GetDescription() + " + 狂暴Buff(x2)";
        }
    }
}