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