第10章装饰模式.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第10章装饰模式(DECORATOR)2019/12/201装饰模式装饰模式publicclassShowDecorator{publicstaticvoidmain(String[]args){try{FileWriterwrite=newFileWriter(c://test.txt);BufferedWriterbw=newBufferedWriter(write);bw.write(hello);bw.close();write.close();}catch(Exceptione){}}}给一个类或对象增加行为:继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的,用户不能控制增加行为的方式和时机装饰模式给一个类或对象增加行为:对象组合(关联机制),即将一个类的对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩展自己的行为,称这个嵌入的对象为装饰器(Decorator)。装饰模式体现:开闭原则。装饰模式装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。这就是装饰模式的模式动机。装饰模式动机动态地给一个对象增加一些额外的职责。其别名也可以称为包装器(Wrapper),与适配器模式的别名相同,但它们适用于不同的场合。根据翻译的不同,装饰模式也有人称之为“油漆工模式”装饰模式定义装饰器模式类UMLcomponentComponent+operation()...ConcreteComponent+operation()...Decorator+operation()...component.operation();ConcreteDecoratorA-addedState:+operation()...ConcreteDecoratorB++operation()addedBehavior()...super.operation();addedBehavior();抽象构件(Component)角色:组件对象的接口,可以给这些对象动态的添加职责具体构件(ConcreteComponent)角色:实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。装饰(Decorator)角色:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象具体装饰(ConcreteDecorator)角色:实际的装饰器对象,实现具体要向被装饰对象添加的功能//抽象构件publicinterfaceComponent{voidsampleOperation();}//具体构件publicclassConcreteComponentimplementsComponent{publicvoidsampleOperation(){//Writeyourcodehere}}//抽象装饰publicclassDecoratorimplementsComponent{privateComponentcomponent;publicDecorator(Componentcomponent){this.component=component;}publicDecorator(){}publicvoidsampleOperation(){component.sampleOperation();}}//具体装饰publicclassConcreteDecoratorextendsDecorator{publicvoidsampleOperation(){super.sampleOperation();}}//客户端publicclassDecoratorTest{publicstaticvoidmain(String[]args){testDecorator();}privateststictestDecorator(){newConcreteDecorator(newConcreteComponent(););}}讨论一个装饰类的接口必须与被装饰类的接口相容尽量保持Component作为一个“轻”类,不要把太多的逻辑和状态放在Component类里。如果只有一个ConcreteComponent类而没有抽象的Component接口,Decorator类经常可以是ConcreteComponent的一个子类与继承关系相比,关联关系的主要优势在于不会破坏类的封装性,而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性,因此使得系统更加容易维护关联关系的缺点是比继承关系要创建更多的对象讨论使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式动态地给一个对象附加更多的责任装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展讨论Java中的应用装饰模式在JDK中最经典的实例是JavaIOJava的IO库提供一个称做链接(Chaining)的机制,可以将一个流处理器与另一个流处理器首尾相接,以其中之一的输出为输入,形成一个流管道的链接。Java中的应用1.java.io.BufferedInputStream(InputStream)2.java.io.DataInputStream(InputStream)3.java.io.BufferedOutputStream(OutputStream)4.java.util.zip.ZipOutputStream(OutputStream)5.java.util.Collections方法checked[List|Map|Set|SortedSet|SortedMap]()Java中的应用例如:DataInputStream流处理器可以把FileInputStream流对象的输出当做输入,将Byte类型的数据转换成Java的原始类型和String类型的数据Java中的应用—I/O输入/输出流管道的装饰器模式Java中的应用—I/O输入/输出流管道的装饰器模式在javax.swing包中,可以通过装饰模式动态给一些构件增加新的行为或改善其外观显示如JList构件本身并不支持直接滚动,即没有滚动条,要创建可以滚动的列表,可以使用如下代码实现:JListlist=newJList();JScrollPanesp=newJScrollPane(list);Java中的应用装饰ServletRequest对象Servlet规范中:filter(拦截模式)。Filter对象:能在request到达servlet的服务方法之前拦截HttpServletRequest对象,而在服务方法转移控制后又能拦截HttpServletResponse对象。可以使用filter来实现特定的任务,比如验证用户输入,以及压缩web内容。装饰ServletRequest对象java.util.Map所包装的HttpServletRequest对象的参数是不可改变的。这极大地缩减了filter的应用范围对ServletRequest很容易应用装饰模式,因为servletAPI已经为其提供了一个包装类:ServletRequestWrapper一个删除空白字符的Filter通过实现一个删除空白字符的filter,来演示如何使用javax.servlet.http.HttpServletRequestWrapper类来装饰HttpServletRequest对象。一个删除空白字符的Filter删除空白符的filterpublicfinalclassMyRequestWrapperextendsHttpServletRequestWrapper{publicMyRequestWrapper(HttpServletRequestservletRequest){super(servletRequest);}publicString[]getParameterValues(Stringparameter){String[]results=super.getParameterValues(parameter);if(results==null)returnnull;intcount=results.length;String[]trimResults=newString[count];for(inti=0;icount;i++){trimResults[i]=results[i].trim();}returntrimResults;}}一个删除空白字符的Filterweb.xml文件filterfilter-nameTrimmerFilter/filter-namefilter-classtrimmer.filter.MyFilter/filter-class/filterfilter-mappingfilter-nameTrimmerFilter/filter-nameurl-pattern*.do/url-pattern/filter-mapping问题:中文乱吗?publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{//TODOAuto-generatedmethodstubjavax.servlet.http.HttpServletRequestreq=(javax.servlet.http.HttpServletRequest)request;MyRequestr=newMyRequest(req);chain.doFilter(r,response);}装饰器模式具有如下的特征它必须具有一个装饰的对象它必须拥有与被装饰对象相同的接口它可以给被装饰对象添加额外的功能装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。装饰模式优点通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合。可以使用多个具体装饰类来装饰同一对象,得到功能更为强大的对象。具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。装饰模式优点使用装饰模式进行系统设计时将产生很多小对象,这些对象的区别在于它们之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,同时还将产生很多具体装饰类。这些装饰类和小对象的产生将增加系统的复杂度,加大学习与理解的难度。装饰模式缺点比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。装饰模式缺点何时使用装饰器模式需要扩展一个类的功能,或给一个类增加附加责任。需要动态地给一个对象增加功能,这些功能可以动态撤销。需要增加由一些基本的排列组合产生大量的功能,从而使继承关系变得不现实练习题一段Java代码的核心逻辑是一个平均值计算程序。请使用装饰模式在它的基础上实现两个额外的计算功能:超过平均值的数字个数和方差。用装饰模式创建一个具有多个关键属性的过滤器超类。该过滤器类将:(1)支持构造器接收某Writer对象为参数;(2)充当过滤器类层次的超类;(3)提供除w

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功