Jimmypony的技术汇总区
很多都不会,很多都不懂,不要浮躁,静心学习

装饰者模式,所谓装饰者模式,就是能够自由动态扩展功能,装饰者和被装饰折拥有同一个超类,比如System.IO系统,

我个人认为的装饰者模式就是 (((被装饰者)装饰者+)+装饰者)+装饰者.....无穷无尽的扩展.....

该模式也符合设计模式原则:

开-闭原则对扩展开放,对修改关闭.

优先使用组合而非继承,不过这里继承的目的不是为了获得行为而是为了匹配类型

以下以咖啡饮料为例解释装饰者模式:

 

 1    /// <summary>
 2    /// 被装饰者超类
 3    /// </summary>

 4    public abstract class super
 5    {
 6        public abstract void write();
 7    }

 8    /// <summary>
 9    /// 装饰者继承超类
10    /// </summary>

11    public abstract class Component:super
12    {
13        public abstract void getTotal();
14    }

15
16    /// <summary>
17    /// 被装饰者
18    /// </summary>

19    public class decker:super
20    {
21        string name;
22        int price;
23
24        public decker(string name, int price)
25        {
26            this.name = name;
27            this.price = price;
28        }

29        public override void write()
30        {
31            Console.WriteLine(string.Format(@"我是被装饰者:{0},我的价格是{1}", name, Price));
32        }

33    }

34    /// <summary>
35    /// 装饰者
36    /// </summary>

37    public class decoratee : Component
38    {
39        string name;
40        int price;
41        super s;
42
43        public decoratee(string name, int price,super s)
44        {
45            this.name = name;
46            this.price = price;
47            this.s = s;
48        }

49        public override void getTotal()
50        {
51            write();
52        }

53        public override void write()
54        {
55            s.write();
56            //自定义方法
57            Console.WriteLine(string.Format(@"我是装饰者:{0},我的价格是{1}", name, price));
58        }

59    }

60
61    class Program
62    {
63        static void Main(string[] args)
64        {
65            //定义被装饰者
66            super d_1 = new decker("卡布奇诺"15);
67            //定义被装饰者
68            Component dec_1 = new decoratee(""3, d_1);
69            //循环包装
70            dec_1 = new decoratee("吸管"2, dec_1);
71            dec_1 = new decoratee("大杯子"2, dec_1);
72            dec_1 = new decoratee("精美包装盒"4, dec_1);
73            dec_1 = new decoratee("牛奶"1, dec_1);
74
75            //统计
76            dec_1.getTotal();
77            Console.ReadKey();
78        }

79    }
 


运行结果:

posted on 2008-09-18 09:36  Jim~  阅读(243)  评论(0编辑  收藏  举报