重温设计模式之装饰者
上一篇说了观察者模式,趁着热情还在,赶紧续上一杯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();
执行结果如图:
概念和实例均引用了如下几位博友的文章,记下以备后续!