设计模式之装饰设计

  装饰设计模式,顾明思议,就是对一个类的功能进行增强。充分利用继承以及虚方法的特性,可以让一个类适应某些特别的需求。就好比如是一个人的穿着打扮,因为人的穿着搭配是多种多样的,并且穿着的先后顺序千变万化,搭配的种类特别多。下面就模仿人的穿着写一个简单的小例子。

  首先是,人的基类,Person,代码如下:

  这里定义了两个构造函数,第一个构造函数比较易于理解,它主要是实例化一个带有特定称谓的“人”。第二个构造函数,这里先不说它的作用。。。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZhuangShiSheJi.Code
{
    public class Person
    {
        private string name;
        public Person(string name)
        {
            this.name = name;
        }

        public Person() { }

        public virtual void Show()
        {
            Console.Write(" 装扮的{0}",name);
        }
    }
}

  然后定义一个穿着类,让其继承与Person,代码如下

  该类的作用是对person类的增强,其Destrocter方法接收一个person对象,重写了父类的show方法,让其执行增强后的show方法。在这里大家可能会有一个疑问,这不就是相当于直接执行person中的show方法吗?呵呵,别急,且往下看。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZhuangShiSheJi.Code
{
    public class Finestiner : Person
    {
        private Person p;

        public void Destrocter(Person p)
        {
            this.p = p;
        }

        public override void Show()
        {
            if (p != null)
            {
                p.Show();
            }
        }
    }
}

  定义一个衬衫类TShirt,让其继承于Finestiner类,并重写person类中的show方法,这里,大家应该恍然大悟了吧,没错,其实TShirt方法才是真正的对父类Finestiner的父类Person进行增强,这里的show方法,利用了继承的特定,在执行了自定义的代码之后,会继续执行父类的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZhuangShiSheJi.Code
{
    public class TShirt : Finestiner
    {
        public override void Show()
        {
            Console.Write(" 大T衫");
            base.Show();
        }
    }
}

  在添加一个裤子类,KuZi,其原理与TShirt类一样,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ZhuangShiSheJi.Code
{
    public class KuZi : Finestiner
    {
        public override void Show()
        {
            Console.Write(" 烂短裤");
            base.Show();
        }
    }
}

  然后是调用,这里非常重要!这里利用了继承的特性,创建子类对象的时候,会先去创建父类的对象,所有这里我给Person类添加了一个貌似没有必要的构造函数public Person(){},如果不这么做会报错。

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ZhuangShiSheJi.Code;

namespace ZhuangShiSheJi
{
    class Program
    {
        static void Main(string[] args)
        {
            Person xx = new Person("胖纸");
            Finestiner ff = new Finestiner();
            ff.Destrocter(xx);

            TShirt ts = new TShirt();
            KuZi kz = new KuZi();

            ts.Destrocter(ff);
            kz.Destrocter(ts);

            kz.Show();
            Console.ReadKey();
        }
    }
}

  这里,创建了一个名字叫做“胖纸”的人xx,然后依次创建Finestiner对象ff,TShirt对象ts,KuZi对象kz,把xx对象填装到ff对象中,把ff对象填装到ts对象中,ts对象填装到kz对象中;这就形成了一中传递依赖:kz->ts->ff->xx;然后在执行的时候,会从左到右依次调用这些对象的show方法(PS,这些对象在创建的时候,会调用父类Person中的无参数构造函数,有兴趣的不妨调试下,笔者就曾经笔试过的类似的题目,而且理解这一过程也有助于以后的学习)。

  

posted @ 2015-05-11 22:16  尋找一個證明  阅读(76)  评论(0)    收藏  举报