侧边栏壁纸
  • 累计撰写 42 篇文章
  • 累计创建 51 个标签
  • 累计收到 7 条评论

设计模式之-装饰器模式

小周黎
2021-01-15 / 0 评论 / 0 点赞 / 255 阅读 / 1,786 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

什么是装饰器模式?

在不改变原对象的基础上,通过对其进行包装扩展(添加属性或方法),使原有对象可以满足用户的更复杂需求,满足开闭原则,也不会破坏现有的操作。

装饰器模式属于结构性模式。

举例场景

emmm,我想一想,就用英雄联盟里我的本命英雄“锐雯”释放技能来举个例子吧。

游戏开始,一级学个Q,出门对线去咯,然后使用ERQ连招(简化一下不要平A了),还可以使用REQ连招......等

接下来就用代码实现一下此功能

C#代码实现

定义英雄抽象类

/// <summary>
    /// 英雄
    /// </summary>
    public abstract class BaseHero
    {
        /// <summary>
        /// 攻击
        /// </summary>
        public abstract void Spawn();
    }

定义锐雯类实现英雄接口

/ /// <summary>
    /// 锐雯
    /// </summary>
    public class RuiWenBaseHero : BaseHero
    {
        /// <summary>
        /// 攻击
        /// </summary>
        public override void Spawn()
        {
            Console.WriteLine("来一个光速qqq");
        }
    }

接下来是重点,定义英雄装饰器基类

   /// <summary>
    /// 英雄装饰器基类
    /// </summary>
    public class DecoratorBaseHero : BaseHero
    {
        private BaseHero hreo;
        public DecoratorBaseHero(BaseHero _hreo)
        {
            hreo = _hreo;
        }
        public override void Spawn()
        {
            hreo.Spawn();
        }
    }

然后继承装饰器基类为锐雯实现一个E技能

  /// <summary>
    /// 使用E技能(勇往直前)
    /// </summary>
    public class ERuiWenHeroDecorator : DecoratorBaseHero
    {
        public ERuiWenHeroDecorator(BaseHero hreo) : base(hreo)
        {

        }
        public override void Spawn()
        {
            base.Spawn();
            Console.WriteLine("E勇往直前,挡一下伤害");
        }
    }

再来一个R技能吧

 /// <summary>
    /// 使用R技能(放逐之锋)
    /// </summary>
    public class RRuiWenHeroDecorator : DecoratorBaseHero
    {
        public RRuiWenHeroDecorator(BaseHero hreo) : base(hreo)
        {

        }
        public override void Spawn()
        {
            base.Spawn();
            Console.WriteLine("开R,秒人");
        }
    }

最后来使用一下连招 QWER

class Program
    {
        static void Main(string[] args)
        {
           //初始化锐雯
            BaseHero hero = new RuiWenBaseHero();
            //使用装饰器叫锐雯 使出w技能
            hero = new WRuiWenHeroDecorator(hero);
            //使用装饰器叫锐雯 使出e技能
            hero = new ERuiWenHeroDecorator(hero);
            //使用装饰器叫锐雯 使出w技能
            hero = new RRuiWenHeroDecorator(hero);
            hero.Spawn();
            Console.ReadKey();
        }

     }

运行结果

image.png

还可以随意组合 比如使出QREW 改变顺序即可

class Program
    {
        static void Main(string[] args)
        {
           //初始化锐雯
            BaseHero hero = new RuiWenBaseHero();
            hero = new RRuiWenHeroDecorator(hero);
            hero = new ERuiWenHeroDecorator(hero);
            hero = new WRuiWenHeroDecorator(hero);
            hero.Spawn();
            Console.ReadKey();
        }

     }

image.png

0

评论区