设计模式之装饰设计
装饰设计模式,顾明思议,就是对一个类的功能进行增强。充分利用继承以及虚方法的特性,可以让一个类适应某些特别的需求。就好比如是一个人的穿着打扮,因为人的穿着搭配是多种多样的,并且穿着的先后顺序千变万化,搭配的种类特别多。下面就模仿人的穿着写一个简单的小例子。
首先是,人的基类,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中的无参数构造函数,有兴趣的不妨调试下,笔者就曾经笔试过的类似的题目,而且理解这一过程也有助于以后的学习)。

浙公网安备 33010602011771号