Alizhou-Blog Alizhou-Blog

周黎的个人博客

目录
设计模式之-装饰器模式
/  

设计模式之-装饰器模式

什么是装饰器模式?

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

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

举例场景

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


标题:设计模式之-装饰器模式
作者:小周黎
地址:https://zhouli.info/articles/2021/01/15/1610689758489.html