设计模式学习笔记-装饰模式
2011-08-17 10:07
351 查看
装饰模式:(Decorator),动态地给一个对象添加一些额外的职责,比单纯的继承更为灵活合理,应用场合比如java的System.IO各种输出就是通过装饰模式来实现的,还有一些日志类,动态的添加日志记录的功能,将耦合度降到最低。这里的基本内容参照大话设计模式的,但是这一节将的并不好,再额外做些补充,供自己和园友们做备忘录用。
Componet 是定义一个对象接口,可以给这些对象动态的添加职责,
ConcreteComponent是定义了一个具体的对象, 也可以给这些对象添加一些职责。
Decorator,装饰抽象类,继承了Component,从外类来扩展Component的功能,
但对于Component来说,是无需要知道Decorator类的存在。
至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能
UML画的不熟练,错误地方望大家指出
View Code
客户端调用:
Componet 是定义一个对象接口,可以给这些对象动态的添加职责,
ConcreteComponent是定义了一个具体的对象, 也可以给这些对象添加一些职责。
Decorator,装饰抽象类,继承了Component,从外类来扩展Component的功能,
但对于Component来说,是无需要知道Decorator类的存在。
至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能
UML画的不熟练,错误地方望大家指出
View Code
namespace DesignPatternLab.DecoratoryPackage { /// <summary> /// 首先,我们需要一个手机的接口或者是抽象类,我这里就用抽象类来实现,代码如下 /// </summary> public abstract class AbstractCellPhone { public abstract string CallNumber(); public abstract string SendMessage(); } //然后,我再来实现Nokia和Moto的手机类 public class NokiaPhone : AbstractCellPhone { public override string CallNumber() { return "NokiaPhone call sombody"; } public override string SendMessage() { return "NokiaPhone send a message to somebody"; } } //然后,我再来实现Nokia和Moto的手机类 public class MotoPhone : AbstractCellPhone { public override string CallNumber() { return "MotoPhone call sombody"; } public override string SendMessage() { return "MotoPhone send a message to somebody"; } } //接下来我需要一个Decorator接口或者抽象类,实现代码如下 public abstract class CellDecorator : AbstractCellPhone { AbstractCellPhone _phone; public CellDecorator(AbstractCellPhone phone) { _phone = phone; } public override string CallNumber() { return _phone.CallNumber(); } public override string SendMessage() { return _phone.SendMessage(); } } /// <summary> /// 这个Decorator即继承了AbstractCellPhone, /// 又包含了一个私有的AbstractCellPhone的对象。 /// 这样做的意义是:Decorator类又使用了另外一个Component类。 /// 我们可以使用一个或多个Decorator对象来“装饰”一个Component对象, /// 且装饰后的对象仍然是一个Component对象。在下来,我要实现GSP和蓝牙的功能扩展, /// 它们要继承自Decorator,代码如下 /// </summary> public class DecoratorGPS : CellDecorator { public DecoratorGPS(AbstractCellPhone phone):base(phone) { } public override string CallNumber() { return base.CallNumber() + " with GPS"; } public override string SendMessage() { return base.SendMessage() + " with GPS"; } } public class DecoratorBlueTooth : CellDecorator { public DecoratorBlueTooth(AbstractCellPhone phone) : base(phone) { } public override string CallNumber() { return base.CallNumber() + " with BlueTooth"; } public override string SendMessage() { return base.SendMessage() + " with BlueTooth"; } } }
客户端调用:
/// <summary> /// 装饰模式案例 /// </summary> static void TestDecoratorCellPhone() { AbstractCellPhone phone = new NokiaPhone(); Console.WriteLine(phone.CallNumber()); Console.WriteLine(phone.SendMessage()); DecoratorGPS gps = new DecoratorGPS(phone); //add GSP Console.WriteLine(gps.CallNumber()); Console.WriteLine(gps.SendMessage()); DecoratorBlueTooth bluetooth = new DecoratorBlueTooth(gps); //add GSP and bluetooth Console.WriteLine(bluetooth.CallNumber()); Console.WriteLine(bluetooth.SendMessage()); Console.Read(); }
相关文章推荐
- 设计模式学习笔记——装饰模式
- 【HeadFirst 设计模式学习笔记】3 装饰模式
- 设计模式学习笔记---装饰模式decorator(Java版)
- 设计模式学习笔记——装饰模式
- 设计模式学习笔记--装饰模式
- 装饰(包装)设计模式学习笔记
- 设计模式学习笔记十五:装饰模式(Decorator Pattern)
- 设计模式学习笔记(三)装饰模式(Decorator)
- 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
- 设计模式学习笔记(三)装饰模式(Decorator)
- 【设计模式学习笔记十】【结构型模式】【装饰模式(Decorator)】
- 设计模式学习笔记之-装饰器设计模式
- 设计模式学习笔记十五:装饰模式(Decorator Pattern)
- 设计模式学习笔记——装饰模式
- 设计模式--装饰模式学习笔记
- 设计模式 学习笔记 之 装饰模式 Decorator(6)
- 设计模式学习笔记--设计模式在Java I/O中的应用(装饰模式和适配器模式)
- 设计模式学习笔记--装饰器模式
- 设计模式学习笔记(2)之装饰模式(Decorator)
- 黑马程序员_基础_IO流学习笔记_文本文件读取及复制、字符流的缓冲区和装饰设计模式