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

下载本文档

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

文档简介

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

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

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

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

5、ration () . Decorator + operation () . component.operation(); ConcreteDecoratorA - addedState : + operation () . ConcreteDecoratorB + + operation () addedBehavior () . super.operation(); addedBehavior(); 抽象构件(抽象构件(Component)角色)角色:组件对象的:组件对象的 接口,可以给这些对象动态的添加职责接口,可以给这些对象动态的添加职责 具体构件(具体构件(Concrete Comp

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

7、现具体要向被装饰对象添加 的功能的功能 /抽象构件抽象构件 public interface Component void sampleOperation(); /具体构件具体构件 public class ConcreteComponent implements Component public void sampleOperation() / Write your code here /抽象装饰抽象装饰 public class Decorator implements Component private Component component; public Decorator(Comp

8、onent component) ponent = component; public Decorator() public void sampleOperation() component.sampleOperation(); /具体装饰具体装饰 public class ConcreteDecorator extends Decorator public void sampleOperation() super.sampleOperation(); /客户端客户端 public class DecoratorTest public static void main(String args)

9、 testDecorator(); private ststic testDecorator() new ConcreteDecorator( new ConcreteComponent (); ); 讨讨 论论 一个装饰类的接口必须与被装饰类的接口相一个装饰类的接口必须与被装饰类的接口相 容容 尽量保持尽量保持Component作为一个作为一个“轻轻”类,不要类,不要 把太多的逻辑和状态放在把太多的逻辑和状态放在Component类里。类里。 如果只有一个如果只有一个ConcreteComponent类而没有类而没有 抽象的抽象的Component接口,接口,Decorator类经常可类经常

10、可 以是以是ConcreteComponent的一个子类的一个子类 与继承关系相比,关联关系的主要优势在于与继承关系相比,关联关系的主要优势在于不会破不会破 坏类的封装性坏类的封装性,而且,而且继承是一种耦合度较大的静态继承是一种耦合度较大的静态 关系,无法在程序运行时动态扩展关系,无法在程序运行时动态扩展。在软件开发阶。在软件开发阶 段,关联关系虽然不会比继承关系减少编码量,但段,关联关系虽然不会比继承关系减少编码量,但 是到了软件维护阶段,由于关联关系使系统具有较是到了软件维护阶段,由于关联关系使系统具有较 好的好的松耦合性松耦合性,因此使得,因此使得系统更加容易维护系统更加容易维护 关联

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

13、.Collections方法方法 checkedList|Map|Set|SortedSet|SortedMap() Java中的应用中的应用 例如例如: DataInputStream流处理器可以把流处理器可以把 FileInputStream流对象的输出当做输入,流对象的输出当做输入, 将将 Byte类型的数据转换成类型的数据转换成Java的原始类型和的原始类型和 String类型的数据类型的数据 Java中的应用中的应用I/O输入输入/输出流管道的装输出流管道的装 饰器模式饰器模式 Java中的应用中的应用I/O输入输入/输出流管道的装输出流管道的装 饰器模式饰器模式 在在javax.s

14、wing包中,可以通过装饰模式动态给包中,可以通过装饰模式动态给 一些构件增加新的行为或改善其外观显示一些构件增加新的行为或改善其外观显示 如如JList构件本身并不支持直接滚动,即没有构件本身并不支持直接滚动,即没有 滚动条,要创建可以滚动的列表,可以使用滚动条,要创建可以滚动的列表,可以使用 如下代码实现如下代码实现: JList list = new JList(); JScrollPane sp = new JScrollPane(list); Java中的应用中的应用 装饰装饰Servlet Request对象对象 Servlet规范中规范中: filter(拦截模式拦截模式)。 F

15、ilter对象对象: 能在能在request到达到达servlet的服务方的服务方 法之前拦截法之前拦截HttpServletRequest对象,而在对象,而在 服 务 方 法 转 移 控 制 后 又 能 拦 截服 务 方 法 转 移 控 制 后 又 能 拦 截 HttpServletResponse对象。对象。 可以可以使用使用filter来实现特定的任务,比如验证来实现特定的任务,比如验证 用户输入,以及压缩用户输入,以及压缩web内容内容。 装饰装饰Servlet Request对象对象 java.util.Map所包装的所包装的HttpServletRequest对象的参对象的参 数是

16、不可改变的。这极大地缩减了数是不可改变的。这极大地缩减了filter的应用范围的应用范围 对对ServletRequest很容易应用装饰模式,因为很容易应用装饰模式,因为servlet API已经已经 为其提供了一个包装类:为其提供了一个包装类:ServletRequestWrapper 一个删除空白字符的一个删除空白字符的Filter 通过实现一个删除空白字符的通过实现一个删除空白字符的filter,来演示如,来演示如 何使用何使用 javax.servlet.http.HttpServletRequestWrapper 类来装饰类来装饰HttpServletRequest对象对象。 一个删

17、除空白字符的一个删除空白字符的Filter 删除空白符的删除空白符的filter public final class MyRequestWrapper extends HttpServletRequestWrapper public MyRequestWrapper(HttpServletRequest servletRequest) super(servletRequest); public String getParameterValues(String parameter) String results = super.getParameterValues(parameter); if

18、 (results = null) return null; int count = results.length; String trimResults = new Stringcount; for (int i = 0; i count; i+) trimResultsi = resultsi.trim(); return trimResults; 一个删除空白字符的一个删除空白字符的Filter web.xml文件文件 TrimmerFilter trimmer.filter.MyFilter TrimmerFilter *.do 问题:问题: 中文乱吗中文乱吗? public void

19、 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException / TODO Auto-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

提交评论