第10章 装饰模式_第1页
第10章 装饰模式_第2页
第10章 装饰模式_第3页
第10章 装饰模式_第4页
第10章 装饰模式_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第10章章 装饰模式装饰模式(DECORATOR)2022-5-281装饰模式装饰模式装饰模式装饰模式public class ShowDecorator public static void main(String args) try FileWriter write = new FileWriter(c:/test.txt); BufferedWriter bw = new BufferedWriter(write); bw.write(hello); bw.close(); write.close(); catch (Exception e) 给一个类或对象增加行为:给一个类或对象增加

2、行为:继承机制继承机制,使用继承机制是给现有类添,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是还拥有父类的方法。但是这种方法是静态静态的,用户不能控制增加行为的方式和时机的,用户不能控制增加行为的方式和时机装饰模式装饰模式给一个类或对象增加行为:给一个类或对象增加行为:对象组合(关联机制)对象组合(关联机制),即将一个类的,即将一个类的对象嵌入另一个对象中,由另一个对象对象嵌入另一个对象中,由另一个对象来决定是否调用嵌入对象的行为以便扩来决

3、定是否调用嵌入对象的行为以便扩展自己的行为,称这个嵌入的对象为展自己的行为,称这个嵌入的对象为装装饰器饰器(Decorator)。装饰模式体现:装饰模式体现:开闭原则开闭原则。装饰模式装饰模式装饰模式以装饰模式以对客户透明的方式动态地给一个对客户透明的方式动态地给一个对象附加上更多的责任对象附加上更多的责任,换言之,客户端并,换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。不会觉得对象在装饰前和装饰后有什么不同。装饰模式可以装饰模式可以在不需要创造更多子类的情况在不需要创造更多子类的情况下,将对象的功能加以扩展下,将对象的功能加以扩展。这就是装饰模。这就是装饰模式的模式动机。式的模式动

4、机。装饰模式动机装饰模式动机动态地给一个对象增加一些额外的职责动态地给一个对象增加一些额外的职责。其别名也可以称为其别名也可以称为包装器包装器(Wrapper),与适配器模式的别名相同,但它们适用与适配器模式的别名相同,但它们适用于不同的场合。于不同的场合。根据翻译的不同,装饰模式也有人称之根据翻译的不同,装饰模式也有人称之为为“油漆工模式油漆工模式”装饰模式定义装饰模式定义装饰器模式装饰器模式类类UMLcomponentComponent+ operation ().ConcreteComponent+ operation ().Decorator+ operation ().compone

5、nt.operation();ConcreteDecoratorA- addedState : + operation ().ConcreteDecoratorB+operation ()addedBehavior ().super.operation();addedBehavior(); 抽象构件(抽象构件(Component)角色)角色:组件对象的:组件对象的接口,可以给这些对象动态的添加职责接口,可以给这些对象动态的添加职责具体构件(具体构件(Concrete Component)角色:实现角色:实现组件对象接口,通常就是被装饰器装饰的原始组件对象接口,通常就是被装饰器装饰的原始对象,也

6、就是可以给这个对象添加职责。对象,也就是可以给这个对象添加职责。装饰(装饰(Decorator)角色)角色:所有装饰器的抽象:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,父类,需要定义一个与组件接口一致的接口,并持有一个并持有一个Component对象,其实就是持有一对象,其实就是持有一个被装饰的对象个被装饰的对象具体装饰(具体装饰(Concrete Decorator)角色)角色:实际:实际的装饰器对象,实现具体要向被装饰对象添加的装饰器对象,实现具体要向被装饰对象添加的功能的功能/抽象构件抽象构件public interface Component void sampleOpe

7、ration(); /具体构件具体构件public class ConcreteComponent implements Component public void sampleOperation() / Write your code here /抽象装饰抽象装饰 public class Decorator implements Component private Component component; public Decorator(Component component) ponent = component; public Decorator() public void samp

8、leOperation() component.sampleOperation(); /具体装饰具体装饰public class ConcreteDecorator extends Decorator public void sampleOperation() super.sampleOperation(); /客户端客户端public class DecoratorTest public static void main(String args) testDecorator(); private ststic testDecorator() new ConcreteDecorator( ne

9、w ConcreteComponent (); ); 讨讨 论论 一个装饰类的接口必须与被装饰类的接口相一个装饰类的接口必须与被装饰类的接口相容容尽量保持尽量保持Component作为一个作为一个“轻轻”类,不要类,不要把太多的逻辑和状态放在把太多的逻辑和状态放在Component类里。类里。如果只有一个如果只有一个ConcreteComponent类而没有类而没有抽象的抽象的Component接口,接口,Decorator类经常可类经常可以是以是ConcreteComponent的一个子类的一个子类 与继承关系相比,关联关系的主要优势在于与继承关系相比,关联关系的主要优势在于不会破不会破坏类

10、的封装性坏类的封装性,而且,而且继承是一种耦合度较大的静态继承是一种耦合度较大的静态关系,无法在程序运行时动态扩展关系,无法在程序运行时动态扩展。在软件开发阶。在软件开发阶段,关联关系虽然不会比继承关系减少编码量,但段,关联关系虽然不会比继承关系减少编码量,但是到了软件维护阶段,由于关联关系使系统具有较是到了软件维护阶段,由于关联关系使系统具有较好的好的松耦合性松耦合性,因此使得,因此使得系统更加容易维护系统更加容易维护关联关系的缺点是关联关系的缺点是比继承关系要创建更多的对象比继承关系要创建更多的对象讨讨 论论 使用装饰模式来实现扩展比继承更加灵活,使用装饰模式来实现扩展比继承更加灵活,它以

11、对客户透明的方式动态地给一个对象它以对客户透明的方式动态地给一个对象附加更多的责任附加更多的责任装饰模式可以在不需要创造更多子类的情装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展况下,将对象的功能加以扩展 讨讨 论论 Java中的应用中的应用 装饰模式在装饰模式在JDK中最经典的实例是中最经典的实例是Java IO Java的的IO库提供一个称做链接(库提供一个称做链接(Chaining)的机制,可以将一个流处理器与另一个流处的机制,可以将一个流处理器与另一个流处理器首尾理器首尾 相接,以其中之一的输出为输入,相接,以其中之一的输出为输入,形成一个流管道的链接。形成一个流管道的

12、链接。 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方法方法checkedList|Map|Set|SortedSet|SortedMap()Java中的应用中的应用 例如例如: DataInputStream流处理器

13、可以把流处理器可以把FileInputStream流对象的输出当做输入,流对象的输出当做输入, 将将Byte类型的数据转换成类型的数据转换成Java的原始类型和的原始类型和String类型的数据类型的数据Java中的应用中的应用I/O输入输入/输出流管道的装输出流管道的装饰器模式饰器模式Java中的应用中的应用I/O输入输入/输出流管道的装输出流管道的装饰器模式饰器模式 在在javax.swing包中,可以通过装饰模式动态给包中,可以通过装饰模式动态给一些构件增加新的行为或改善其外观显示一些构件增加新的行为或改善其外观显示 如如JList构件本身并不支持直接滚动,即没有构件本身并不支持直接滚动

14、,即没有滚动条,要创建可以滚动的列表,可以使用滚动条,要创建可以滚动的列表,可以使用如下代码实现如下代码实现:JList list = new JList();JScrollPane sp = new JScrollPane(list); Java中的应用中的应用装饰装饰Servlet Request对象对象 Servlet规范中规范中: filter(拦截模式拦截模式)。 Filter对象对象: 能在能在request到达到达servlet的服务方的服务方法之前拦截法之前拦截HttpServletRequest对象,而在对象,而在服 务 方 法 转 移 控 制 后 又 能 拦 截服 务 方

15、法 转 移 控 制 后 又 能 拦 截 HttpServletResponse对象。对象。 可以可以使用使用filter来实现特定的任务,比如验证来实现特定的任务,比如验证用户输入,以及压缩用户输入,以及压缩web内容内容。装饰装饰Servlet Request对象对象 java.util.Map所包装的所包装的HttpServletRequest对象的参对象的参数是不可改变的。这极大地缩减了数是不可改变的。这极大地缩减了filter的应用范围的应用范围对对ServletRequest很容易应用装饰模式,因为很容易应用装饰模式,因为servlet API已经已经为其提供了一个包装类:为其提供了

16、一个包装类:ServletRequestWrapper一个删除空白字符的一个删除空白字符的Filter通过实现一个删除空白字符的通过实现一个删除空白字符的filter,来演示如,来演示如何使用何使用javax.servlet.http.HttpServletRequestWrapper类来装饰类来装饰HttpServletRequest对象对象。一个删除空白字符的一个删除空白字符的Filter删除空白符的删除空白符的filterpublic final class MyRequestWrapper extends HttpServletRequestWrapper public MyReque

17、stWrapper(HttpServletRequest servletRequest) super(servletRequest); public String getParameterValues(String parameter) String results = super.getParameterValues(parameter); if (results = null) return null; int count = results.length; String trimResults = new Stringcount; for (int i = 0; i count; i+)

18、 trimResultsi = resultsi.trim(); return trimResults; 一个删除空白字符的一个删除空白字符的Filterweb.xml文件文件 TrimmerFilter trimmer.filter.MyFilter TrimmerFilter *.do 问题:问题: 中文乱吗中文乱吗?public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException / TODO Auto

19、-generated method stub javax.servlet.http.HttpServletRequest req=(javax.servlet.http.HttpServletRequest)request; MyRequest r=new MyRequest(req); chain.doFilter(r, response); 装饰器模式具有如下的特征装饰器模式具有如下的特征 它必须具有一个装饰的对象它必须具有一个装饰的对象 它必须拥有与被装饰对象相同的接口它必须拥有与被装饰对象相同的接口 它可以给被装饰对象添加额外的功能它可以给被装饰对象添加额外的功能装饰模式与继承关系的目

20、的都是要扩展对象装饰模式与继承关系的目的都是要扩展对象的功能,但是的功能,但是装饰模式可以提供比继承更多装饰模式可以提供比继承更多的灵活性的灵活性。 可以可以通过一种动态的方式来扩展一个对象的通过一种动态的方式来扩展一个对象的功能功能,通过配置文件可以在运行时选择不同,通过配置文件可以在运行时选择不同的装饰器,从而实现不同的行为。的装饰器,从而实现不同的行为。装饰模式装饰模式优点优点通过使用不同的具体装饰类以及这些装饰类的排通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合列组合,可以创造出很多不同行为的组合。可以。可以使用多个具体装饰类来装饰同一对象,得到功能使用

21、多个具体装饰类来装饰同一对象,得到功能更为强大的对象。更为强大的对象。具体构件类与具体装饰类可以独立变化具体构件类与具体装饰类可以独立变化,用户可,用户可以根据需要增加新的具体构件类和具体装饰类,以根据需要增加新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,在使用时再对其进行组合,原有代码无须改变,符合符合“开闭原则开闭原则”。装饰模式优点装饰模式优点使用装饰模式进行系统设计时使用装饰模式进行系统设计时将产生将产生很多小对象很多小对象,这些对象的区别在于它们,这些对象的区别在于它们之间相互连接的方式有所不同,而不是之间相互连接的方式有所不同,而不是它们的类或者属性值有所不同,同时还它们的类或者属性值有所不同,同时还将产生很多具体装饰类。这些装饰类和将产生很多具体装饰类。这些装饰类和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论