《12 C#设计模式-装饰模式.ppt》由会员分享,可在线阅读,更多相关《12 C#设计模式-装饰模式.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、www.ChinaSA.infoDDesign esign P Patternsatterns装饰模式装饰模式装饰模式装饰模式刘刘 伟伟(Sunny)weiliu_www.ChinaSA.info大纲w装饰模式概述w装饰模式的结构与实现w装饰模式的应用实例w透明装饰模式与半透明装饰模式w装饰模式的优缺点与适用环境装修前装修前装修后装修后www.ChinaSA.info装饰模式概述w现实生活中的“装饰”实例www.ChinaSA.info装饰模式概述w装饰模式分析可以可以在不改变一个对象本身功能的基础上给对象增加在不改变一个对象本身功能的基础上给对象增加额外的新行为额外的新行为是一种是一种用于替
2、代继承的技术用于替代继承的技术,它通过一种无须定义子,它通过一种无须定义子类的方式类的方式给对象动态增加职责给对象动态增加职责,使用对象之间的,使用对象之间的关联关联关系关系取代类之间的取代类之间的继承关系继承关系引入了引入了装饰类装饰类,在装饰类中既可以调用待装饰的原有,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩展原有类的功类的方法,还可以增加新的方法,以扩展原有类的功能能www.ChinaSA.info装饰模式概述w装饰模式的定义对象结构型对象结构型模式模式装装饰饰模模式式:动动态态地地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比比使使用用子子
3、类类更更加加灵灵活活的的替替代方案代方案。Decorator Pattern:Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extending functionality.www.ChinaSA.info装饰模式概述w装饰模式的定义以对客户透明的方式以对客户透明的方式动态地给一个对象动态地给一个对象附加上更多的责任附加上更多的责任可以在可以在不需要创建更多子类不需要创建更多子类的情况下,的情况下,让对
4、象的功能得以扩展让对象的功能得以扩展www.ChinaSA.info装饰模式的结构与实现w装饰模式的结构www.ChinaSA.info装饰模式的结构与实现w装饰模式的结构装饰模式包含以下装饰模式包含以下4个角色:个角色:Component(抽象构件)ConcreteComponent(具体构件)Decorator(抽象装饰类)ConcreteDecorator(具体装饰类)www.ChinaSA.info装饰模式的结构与实现w装饰模式的实现抽象构件类典型代码:抽象构件类典型代码:abstract class Component public abstract void Operation()
5、;www.ChinaSA.info装饰模式的结构与实现w装饰模式的实现具体构件类典型代码:具体构件类典型代码:class ConcreteComponent:Component public override void Operation()/基本功能实现 www.ChinaSA.info装饰模式的结构与实现w装饰模式的实现抽象装饰类典型代码:抽象装饰类典型代码:class Decorator:Componentprivate Component component;/维维持一个持一个对对抽象构件抽象构件对对象的引用象的引用 /注入一个抽象构件注入一个抽象构件类类型的型的对对象象 public
6、 Decorator(Component component)ponent=component;public override void Operation()component.Operation();/调调用原有用原有业务业务方法方法 www.ChinaSA.info装饰模式的结构与实现w装饰模式的实现具体装饰类典型代码:具体装饰类典型代码:class ConcreteDecorator:Decorator public ConcreteDecorator(Component component):base(component)public override void Operation(
7、)base.Operation();/调调用原有用原有业务业务方法方法 AddedBehavior();/调调用新增用新增业务业务方法方法 /新增业务方法 public void AddedBehavior()/功能扩展 www.ChinaSA.info装饰模式的应用实例w实例说明某软件公司基于面向对象技术开发了一套图形界面构件库VisualComponent,该构件库提供了大量基本构件,如窗体、文本框、列表框等,由于在使用该构件库时,用户经常要求定制一些特殊的显示效果,如带滚动条的窗体、带黑色边框的文本框、既带滚动条又带黑色边框的列表框等等,因此经常需要对该构件库进行扩展以增强其功能。现使用
8、装饰模式来设计该图形界面构件库。www.ChinaSA.info装饰模式的应用实例w实例类图图形界面构件库结构图图形界面构件库结构图www.ChinaSA.info装饰模式的应用实例w实例代码(1)VisualComponent:抽象界面构件类,充当抽象构件类:抽象界面构件类,充当抽象构件类(2)Window:窗体类,充当具体构件类:窗体类,充当具体构件类(3)TextBox:文本框类,充当具体构件类:文本框类,充当具体构件类(4)ListBox:列表框类,充当具体构件类:列表框类,充当具体构件类(5)ComponentDecorator:构件装饰类,充当抽象装饰类:构件装饰类,充当抽象装饰类
9、(6)ScrollBarDecorator:滚动条装饰类,充当具体装饰类:滚动条装饰类,充当具体装饰类(7)BlackBorderDecorator:黑色边框装饰类,充当具体装饰类:黑色边框装饰类,充当具体装饰类(8)Program:客户端测试类:客户端测试类演示演示演示演示参考代码参考代码(DesignPatternDecoratorSample)www.ChinaSA.info装饰模式的应用实例w结果及分析实现多次装饰实现多次装饰using System;namespace DecoratorSample class Program static void Main(string args
10、)VisualComponent component,componentSB,componentBB;/全全部部使使用用抽抽象构件定象构件定义义 component=new Window();/创创建具体构件建具体构件对对象象 componentSB=new ScrollBarDecorator(component);/定定义义装装饰饰后的构件后的构件 componentBB=new BlackBorderDecorator(componentSB);/将将装装饰饰了了一一次次的的对对象象继续继续注入另注入另一个装一个装饰类饰类中,中,进进行第二次装行第二次装饰饰 componentBB.Di
11、splay();Console.Read();为构件增加黑色边框!为构件增加滚动条!显示窗体!www.ChinaSA.info透明装饰模式与半透明装饰模式w透明装饰模式透明透明(Transparent)装饰模式:装饰模式:要求要求客户端完全针对客户端完全针对抽象编程抽象编程,装饰模式的透明性要求,装饰模式的透明性要求客户端程序不应该客户端程序不应该将对象声明为具体构件类型或具体装饰类型将对象声明为具体构件类型或具体装饰类型,而应该而应该全部声明为抽象构件类型全部声明为抽象构件类型对于客户端而言,对于客户端而言,具体构件对象和具体装饰对象没有具体构件对象和具体装饰对象没有任何区别任何区别www.
12、ChinaSA.info透明装饰模式与半透明装饰模式w透明装饰模式可以可以让客户端透明地使用装饰之前的对象和装饰之后让客户端透明地使用装饰之前的对象和装饰之后的对象的对象,无须关心它们的区别,无须关心它们的区别可以对一个已装饰过的对象进行多次装饰可以对一个已装饰过的对象进行多次装饰,得到更为,得到更为复杂、功能更为强大的对象复杂、功能更为强大的对象无法无法在客户端在客户端单独调用新增方法单独调用新增方法AddedBehavior()Component component_o,component_d1,component_d2;/全部使用抽象构件定全部使用抽象构件定义义component_o=n
13、ew ConcreteComponent();component_d1=new ConcreteDecorator1(component_o);component_d2=new ConcreteDecorator2(component_d1);component_d2.Operation();/无法无法单单独独调调用用component_d2的的AddedBehavior()方法方法www.ChinaSA.info透明装饰模式与半透明装饰模式w半透明装饰模式半透明半透明(Semi-transparent)装饰模式:装饰模式:用具体装饰类用具体装饰类型来定义装饰之后的对象型来定义装饰之后的对象,
14、而,而具体构件使用抽象构件具体构件使用抽象构件类型来定义类型来定义对于客户端而言,对于客户端而言,具体构件类型无须关心,是透明的具体构件类型无须关心,是透明的;但是但是具体装饰类型必须指定,这是不透明的具体装饰类型必须指定,这是不透明的www.ChinaSA.info透明装饰模式与半透明装饰模式w半透明装饰模式可以给系统带来更多的灵活性,设计相对简单,使用可以给系统带来更多的灵活性,设计相对简单,使用起来也非常方便起来也非常方便客户端使用具体装饰类型来定义装饰后的对象,因此客户端使用具体装饰类型来定义装饰后的对象,因此可以单独调用可以单独调用AddedBehavior()方法方法最大的缺点在于
15、最大的缺点在于不能实现对同一个对象的多次装饰不能实现对同一个对象的多次装饰,而且而且客户端需要有区别地对待装饰之前的对象和装饰客户端需要有区别地对待装饰之前的对象和装饰之后的对象之后的对象Component component_o;/使用抽象构件使用抽象构件类类型定型定义义component_o=new ConcreteComponent();component_o.Operation();ConcreteDecorator component_d;/使用具体装使用具体装饰类饰类型定型定义义component_d=new ConcreteDecorator(component_o);compo
16、nent_d.Operation();component_d.AddedBehavior();/单单独独调调用新增用新增业务业务方法方法www.ChinaSA.info装饰模式的优缺点与适用环境w模式优点对于扩展一个对象的功能,对于扩展一个对象的功能,装饰模式比继承装饰模式比继承更加灵活,不会导致类的个数急剧增加更加灵活,不会导致类的个数急剧增加可以可以通过一种动态的方式来扩展一个对象的通过一种动态的方式来扩展一个对象的功能功能,通过配置文件可以在运行时选择不同,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为的具体装饰类,从而实现不同的行为可以对一个对象进行可以对一个对象进行
17、多次装饰多次装饰具体构件类与具体装饰类可以独立变化,用具体构件类与具体装饰类可以独立变化,用户户可以根据需要增加新的具体构件类和具体可以根据需要增加新的具体构件类和具体装饰类装饰类,且原有类库代码无须改变,且原有类库代码无须改变,符合开符合开闭原则闭原则www.ChinaSA.info装饰模式的优缺点与适用环境w模式缺点使用装饰模式进行系统设计时使用装饰模式进行系统设计时将产生很将产生很多小对象多小对象,大量小对象的产生势必会占,大量小对象的产生势必会占用更多的系统资源,用更多的系统资源,在一定程度上影响在一定程度上影响程序的性能程序的性能比继承更加易于出错,排错也更困难比继承更加易于出错,排
18、错也更困难,对于多次装饰的对象,调试时寻找错误对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐可能需要逐级排查,较为烦琐www.ChinaSA.info装饰模式的优缺点与适用环境w模式适用环境在不影响其他对象的情况下,在不影响其他对象的情况下,以动态、以动态、透明的方式给单个对象添加职责透明的方式给单个对象添加职责当当不能采用继承的方式对系统进行扩展不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时或者采用继承不利于系统扩展和维护时可以使用装饰模式可以使用装饰模式www.ChinaSA.info思考w半透明装饰模式能否实现对同一个对象的多次装饰?为什么?www.ChinaSA.infoENDEND