




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从Java类库看设计模式 5在使用Java中的IO类库的时候,是不是快要被它那些功能相似,却又绝对可称得上庞杂的类搞得要发疯了?或许你很不明白为什么要做这么多功能相似的几十个类出来,这就是Decorator模式将要告诉你的了。在IO处理中,Java将数据抽象为流(Stream)。在IO库中,最基本的是InputStream和OutputStream两个分别处理输出和输入的对象(为了叙述简便起见,这儿只涉及字节流,字符流和其完全相似),但是在InputStream和OutputStream中之提供了最简单的流处理方法,只能读入/写出字符,没有缓冲处理,无法处理文件,等等。它们只是提供了最纯粹的抽象,最简单的功能。如何来添加功能,以处理更为复杂的事情呢?你可能会想到用继承。不错,继承确实可以解决问题,但是继承也带来更大的问题,它对每一个功能,都需要一个子类来实现。比如,我先实现了三个子类,分别用来处理文件,缓冲,和读入/写出数据,但是,如果我需要一个既能处理文件,又具有缓冲功能的类呢?这时候又必须在进行一次继承,重写代码。实际上,仅仅这三种功能的组合,就已经是一个很大的数字,如果再加上其它的功能,组合起来的IO类库,如果只用继承来实现的话,恐怕你真的是要被它折磨疯了。图八:JDK中IO流的类层次Decorator模式可以解决这个问题。Decorator字面的意思是装饰的意思,在原有的基础上,每添加一个装饰,就可以增加一种功能。这就是Decorator的本意。比如,对于上面的那个问题,只需要三个Decorator类,分别代表文件处理,缓冲和数据读写三个功能,在此基础上所衍生的功能,都可以通过添加装饰来完成,而不必需要繁杂的子类继承了。更为重要的是,比较继机制承而言,Decorator是动态的,可以在运行时添加或者去除附加的功能,因而也就具有比继承机制更大的灵活性。上面就是Decorator的基本思想,下面的是Decorator模式的静态结构图:图九:Decorator模式的类图可以看到,一个Decorator与装饰的Subject对象有相同的接口,并且除了接口中给出的方法外,每个Decorator均有自己添加的方法,来添加对象功能。每个Decorator均有一个指向Subject对象的引用,附加的功能被添加在这个Subject对象上。而Decorator对象本身也是一个Subject对象,因而它也能够被其他的Decorator所修饰,提供组合的功能。在Java IO操作中,经常可以看到诸如如下的语句:1myStringBuffer=new StringBuffer(This is a sample string to be read);23FilterInputStream myStream=new LineNumberInputStream45( new BufferInputStream( new StringBufferInputStream( myStringBuffer);67myStream.read();89myStream.line();1011多个的Decorator被层叠在一起,最后得到一个功能强大的流。既能够被缓冲,又能够得到行数,这就是Decorator的威力!不仅仅如此,Java中的IO还允许你引入自定义的Decorator,来实现自己想要的功能。在良好的设计背景下,这做起并不复杂,只需要4步:创建两个分别继承了FilterInputStream和 FilterOutputStream的子类重载read()和write()方法来实现自己想要的功能。可以定义或者重载其它方法来提供附加功能。确定这两个类会被一起使用,因为它们在功能上是对称的。就这样,你就可以无限的扩展IO的功能了。在了解了IO中的Decorator后,我们再来看一个Decorator模式应用的具体的例子。这个例子原本是出现在GOF书中的,这儿稍作改动,引来示例。在一个图形用户界面(GUI)中,一个组件有时候需要用到边框或者滚动条,而有时候又不需要,有时候可能两者都要用到。当需要动态的去处或者添加职能的时候,就可以考虑使用Decorator模式了。这儿对于一个VisualComponent组件对象,我们引入了两个Decorator类:BoderDecorator和ScrollDecorator,分别用来为组件添加边框和处理滚动。程序类图如下:图十:Decorator模式的应用例子程序写得很简单,没有包括具体的代码,只是有一个可以运行的框架以供参考。代码如下: 1/Client类用来创建窗体和组件对象,这儿可以看到Decorator是如何组合和应用的 2 3class Client 4 5public static void main (String args ) 6 7Window window = new Window (); 8 9TextView textView = new TextView ();1011window.setContents (1213new BorderDecorator (1415new ScrollDecorator (textView, 500), 1);161718192021/Windows类用来容纳组件对象2223class Window2425VisualComponent contents;2627public Window () 2829public void setContents (VisualComponent vc)3031contents = vc;323334353637/VisualComponent类定义了组件的接口3839class VisualComponent4041public VisualComponent ()4243public void draw ()4445public void resize ()46474849/TextView类是一个显示文本的具体的组件5051class TextView extends VisualComponent5253public TextView ()5455public void draw ()565758596061public void resize ()6263646566676869/Decorator类继承于VisualComponent,定义所有Decorator的缺省方法实现7071class Decorator extends VisualComponent7273private VisualComponent component;7475public Decorator (VisualComponent vc) 7677ponent=vc;78798081public void draw () 8283component.draw ();84858687public void resize () 8889component.resize ();909192939495/BorderDecorator类为组件提供边框9697class BorderDecorator extends Decorator9899private int width;100101public BorderDecorator (VisualComponent vc, int borderWidth)102103super (vc);104105width = borderWidth;106107108109public void draw ()110111super.draw ();112113drawBorder (width);114115116117private void drawBorder (int width)118119120121122123124125/ScrollDecorator类为组件提供滚动条126127class ScrollDecorator extends Decorator128129private int scrollSize;130131public ScrollDecorator (VisualComponent vc, int scrSize)132133super (vc);134135scrollSize = scrSize;136137138139public void draw ()140141scroll();142143super.draw ();144145146147private void scroll ()148149150151152153154Decorator确实能够很好的缓解当功能组合过多时子类继承所能够带来的问题。但是在得到很大的灵活性的同时,Decorator在使用时也表现得较为复杂。看看仅仅为了得到一个IO流,除了要创建核心的流外,还要为其加上各种各样的装饰类,这使得代码变得复杂而难懂。有几个人一开始时没有被Java的I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拯救地球500字10篇范文
- 货真价实的租车合同范本
- 商铺租赁合同与合作协议
- 技术独享合同协议书范本
- 诊所转让合同协议书范本
- 美团外卖招商合作协议书
- 二手房委托协议书模板
- 鞋底手工打磨合同协议书
- 赢利加工厂转让合同范本
- 房屋装修验收合同协议书
- 飞机机型培训课件
- 中国声乐作品课件图片
- 静态爆破监测方案(3篇)
- 神经退行性疾病治疗药物讲课件
- 2025年全国新高考I卷高考全国一卷真题英语试卷(真题+答案)
- YC/T 593-2023打叶复烤加工服务能力评价办法
- 医美员工制度管理制度
- 大棚搭建用工合同范本
- T/CGAS 026.2-2023瓶装液化石油气管理规范第2部分:平台建设
- T/CCS 059-2023智能化煤矿运维技术架构与流程
- 2025至2030年中国窗户胶行业投资前景及策略咨询研究报告
评论
0/150
提交评论