Visitor Statistics
Old Navy Clothing

重温设计模式之装饰者

上一篇说了观察者模式,趁着热情还在,赶紧续上一杯green tea 拿铁,继续来回顾模式,

这里将要登场的是装饰者模式,将涉及以下几个问题:

1 装饰者模式的定义?

2 应用场景?

3 实例分析?

4 剩下的问题?

 

1 定义?

比较官方的说法是:

此模式动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案;

通俗点理解就是:当要动态的给要扩展的对象加上功能,不用继承而是用组合的方式。

 

2 应用场景?

(1)倘若在天朝幸福生活的你哪一天买了新房,接下来肯定得碰上装修的问题,以吊顶专修为例,

你买了新的灯泡,还有一些装修灯泡的灯具,这些灯具有圆形的,有线型的,等等其它,这个场景其实就是一个最常见的装饰者模式,

 

3 来看最实现代码,这里会一步步的使我们的实现看起来像装饰者模式:

(1)先看最简单的实现,此处我们只实现功能,还没有任何模式的身影

首先我们得定义灯泡类,灯具类,如下:

 //灯泡
    public class  light
    {
        public string price; //灯泡的价格
        public string  model; //灯泡的型号

        public light(string price,string model)
        {
            this.price = price;
            this.model = model;
        }

        public string lightInfo()
        {
             return "价格为:"+price+"   型号为:"+model+"的灯泡";
        }
    }


    //圆形灯具
     public class  Squarlamps
    {
        public light light;  //要装饰灯泡,所以这里需要引用灯泡
        public Squarlamps(light light)
        {
            this.light = light;
        }

         public void  Display()
         {
             Console.WriteLine("【圆形灯具装饰】"+this.light.lightInfo()+"的效果!");
         }
    }

     //线型灯具
     public class  Linelamps
    {
        public light light;  //要装饰灯泡,所以这里需要引用灯泡
        public Linelamps(light light)
        {
            this.light = light;
        }

          public void  Display()
         {
              Console.WriteLine("【线型灯具装饰】"+this.light.lightInfo()+"的效果!");
         }
    }

然后在业务中的调用如下:

          light light = new light("100","型号102");
            Squarlamps Squarlamps = new Squarlamps(light);
            Squarlamps.Display();

            Linelamps Linelamps = new Linelamps(light);
            Linelamps.Display();

运行后效果图如下:

 (2)用装饰者模式实现的代码如下:

 //灯泡抽象类
    public  abstract class LightStyle
    {

        public string price; //灯泡的价格
        public  string model; //灯泡的型号
        public virtual  string lightInfo()
        {
            return "灯泡";
        }
    }

    //红色灯泡
    public class RedLight:LightStyle
    {
        public RedLight(string price,string model)
        {
            this.price = price;
            this.model = model;
        }
        
        public override string lightInfo()
        {
            return "型号为:"+this.model+"价格为:"+this.price+ "的红色灯泡";
        }
    }

    //线形灯具
    public class LL : LightStyle
    {
        public LightStyle LightStyle;
        //要装饰的灯泡
        public void Add(LightStyle LightStyle)
        {
            this.LightStyle = LightStyle;
        }

        public override string lightInfo()
        {
            return "【被线型灯具装饰的】"+LightStyle.lightInfo();
        }


    }


    //圆形灯具
    public class SL : LightStyle
    {
        public LightStyle LightStyle;
        //要装饰的灯泡
        public void Add(LightStyle LightStyle)
        {
            this.LightStyle = LightStyle;
        }

        public override string lightInfo()
        {
            return "【被圆形灯具装饰的】" + LightStyle.lightInfo();
        }
    }

调用如下:

   RedLight redLight = new RedLight("100","型号1020");
            LL ll = new LL();
            SL sl = new SL();
            ll.Add(redLight);
            sl.Add(ll);

            Console.WriteLine(sl.lightInfo());
            Console.ReadLine();

执行结果如图:

概念和实例均引用了如下几位博友的文章,记下以备后续!

http://www.2cto.com/kf/201107/97427.html

http://wenku.baidu.com/view/d648e7828762caaedd33d4c0.html

posted @ 2013-04-10 16:23  流水刀客  阅读(146)  评论(0编辑  收藏  举报