装饰模式就是在程序运行的过程中,动态地增加一些功能!(这里面包括的原理是,1、原程序不需要改变,2、运行时增加(其实就像AOP面向切面编程)),这样的功能是非常有用的。

试想一下,很多程序在编写的时候,你根本不知道对像该如何组装。类型打LOL游戏的装备一下,用户要买什么样的装备呢?你在开发的时候并不知情。需要在游戏由用户根据需要动态地增加减少。

如何来做:

1、需要定义抽像接口(连通角色和装备,它们都需要继承)

    public abstract class HeroBase
    {
        public abstract void Show();
    }

2、角色:

    /// <summary>
    /// 泰达米尔,蛮子
    /// </summary>
    public class Tryndamere : HeroBase
    {
        public override void Show()
        {
            Console.WriteLine("梦STORY(蛮王)");
        }
    }

3、装饰者:

    public class DecoratorBase : HeroBase
    {

        /// <summary>
        /// 关键点在于这个临时变量
        /// </summary>
        HeroBase Herobase;
        public DecoratorBase(HeroBase herobase) { Herobase = herobase; }

        /// <summary>
        /// 每装饰一次,都要为 herobase 增加一个这样的 SHOW方法
        /// </summary>
        public override void Show()
        {
            Herobase.Show();
            Console.Write("买_");
        }
    }

 

4、实现者(装备):

    public class 最后的轻语 : DecoratorBase
    {
        public 最后的轻语(HeroBase herobase) : base(herobase)
        {
        }
        /// <summary>
        /// 每装饰一次,都要为 herobase 增加一个这样的 SHOW方法
        /// </summary>
        public override void Show()
        {
            base.Show();
            Console.WriteLine("最后的轻语");
        }
    }

 

5、使用:(不论你是瑞文还是蛮王,都很容易地改变装备,运行中由用户自己决定装备,这样的灵活性就是装饰模式要解决的问题。)

        static void Main(string[] args)
        {



            ////蛮王
          //  HeroBase tryndamere = new Tryndamere();
            //tryndamere.Show();
            ///瑞文
            HeroBase tryndamere = new Raven();

            tryndamere = new 斯塔缇克电刃(tryndamere);
            tryndamere = new 无尽之刃(tryndamere);
            tryndamere = new 破败王者之刃(tryndamere);
            tryndamere = new 幻影之舞(tryndamere);
            tryndamere = new 最后的轻语(tryndamere);
            tryndamere = new 狂战士胫甲(tryndamere);

            tryndamere.Show();

            Console.Read();

        }

结果:

 

写的最详细的参考文档:

http://baike.baidu.com/link?url=JtMOO9sYnc0d9xoJwpKgSWhfmjlRqJctptvI2MwcNM4_wK61nP4qRO42o1QrntS4kR_R2ysOse-DZ4FK2HsDHa

posted on 2016-05-20 11:10  梦回过去  阅读(214)  评论(0编辑  收藏  举报