装饰模式,听起来没有那么复杂,可是理解起来我真的是费了半天的脑筋也没闹明白。

           先不说那么多,来看官方的定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。那么问题出来了,这一堆话里出现了个似曾相识却真的不认识的词“动态地”。怎么就成了动态地,这里的它是和静态相对的那个“动态”吗?

一、简介     

说的明白点应该是:装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。

presto 模式 precede—proceed模式_子类

       这里值得注意的是:COnceteDecoratorB的方法中“AddBehavior”,看到这个方法,有没有点稍微明白点的感觉??

        看完结构图,大家明白“动态地”了吗?别急,看下面的解释。

        所谓动态是说可以在系统运行时动态给对象增加其它职责而不需要修改代码或重新编译;所谓静态是 说必须通过调整代码才能给对象增加职责,而且系统还需要重新编译;

      那么是不是可以这么理解:动态就是运用对那些功能类进行组合,而静态就是相应功能的类之间实现继承。就像《大话设计模式》书中运用装饰模式的代码和使用继承完成的代码。更简单点说,”动态地“就是灵活的(详见文章末尾的例子)。

1.动态地--使用装饰模式

class Program
    {
        static void Main(string[] args)
        {
            Person xc = new Person("小菜");


            Console.WriteLine("\n第一种装扮");

            Sneakers pqx = new Sneakers();
            BigTrousers kk = new BigTrousers();
            TShirts dtx = new TShirts();

            //装饰过程
            pqx.Decorate(xc);
            kk.Decorate(pqx);
            dtx.Decorate(kk);
            dtx.Show();

            Console.WriteLine("\n第二种装扮:");

            LeatherShoes px = new LeatherShoes();
            Tie ld = new Tie();
            Suit xz = new Suit();
            //装饰过程
            px.Decorate(xc);
            ld.Decorate(px);
            xz.Decorate(ld);
            xz.Show();

            Console.Read();

        }
    }

2.静态--实现的是类与类之间的继承


class Suit : Finery
    {
        public override void Show()
        {
            Console.Write("西装");
        }
    }

        这里的代码中,每个子类都要继承它们的父类:Finery。

相比之下,不难得出装饰模式的应用场景和优点:

装饰者模式的应用场景:
1、 想透明并且动态地给对象增加新的职责的时候。
2、 给对象增加的职责,在未来存在增加或减少可能。
3、 用继承扩展功能不太现实的情况下,应该考虑用组合的方式。
装饰者模式的优点:
1、 通过组合而非继承的方式,实现了动态扩展对象的功能的能力。
2、 有效避免了使用继承的方式扩展对象功能而带来的灵活性差,子类无限制扩张的问题。
3、 充分利用了继承和组合的长处和短处,在灵活性和扩展性之间找到完美的平衡点。
4、 装饰者和被装饰者之间虽然都是同一类型,但是它们彼此是完全独立并可以各自独立任意改变的。
5、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

      如果到这儿,大家对装饰模式还有点迷糊,就一起来看下面的这个例子:

      你买了一个笔记本电脑,如下图

presto 模式 precede—proceed模式_子类_02

        可是你觉得它好丑,黑色看着很笨重,想对它进行一下改变,这时要想得到你想要的效果,你就要通过装饰模式对它进行加工,得到下图中的理想造型:

        

presto 模式 precede—proceed模式_应用场景_03

          这样将理论生活化是不是理解起来更加轻松呢?我弄明白了装饰模式,你呢?