本篇文章主要介绍了"设计模式(九)装饰者模式(Decorator Pattern)",主要涉及到方面的内容,对于软件工程感兴趣的同学可以参考一下:
一、引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如S...
class Customer
{
staticvoid Main(string[] args)
{
// 我买了个苹果手机 Phone phone = new ApplePhone();
// 现在想贴膜了 Decorator applePhoneWithSticker = new Sticker(phone);
// 扩展贴膜行为 applePhoneWithSticker.Print();
Console.WriteLine("----------------------\n");
// 现在我想有挂件了 Decorator applePhoneWithAccessories = new Accessories(phone);
// 扩展手机挂件行为 applePhoneWithAccessories.Print();
Console.WriteLine("----------------------\n");
// 现在我同时有贴膜和手机挂件了 Sticker sticker = new Sticker(phone);
Accessories applePhoneWithAccessoriesAndSticker = new Accessories(sticker);
applePhoneWithAccessoriesAndSticker.Print();
Console.ReadLine();
}
从上面的客户端代码可以看出,客户端可以动态地将手机配件增加到手机上,如果需要添加手机外壳时,此时只需要添加一个继承Decorator的手机外壳类,从而,装饰者模式扩展性也非常好。
2.3 装饰者模式的类图
实现完了装饰者模式之后,让我们看看装饰者模式实现中类之间的关系,具体见下图:

在装饰者模式中各个角色有:
抽象构件(Phone)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
具体构件(AppPhone)角色:定义一个将要接收附加责任的类。
装饰(Dicorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Sticker和Accessories)角色:负责给构件对象 ”贴上“附加的责任。
三、装饰者模式的优缺点