java设计模式之装饰设计模式_第1页
java设计模式之装饰设计模式_第2页
java设计模式之装饰设计模式_第3页
java设计模式之装饰设计模式_第4页
全文预览已结束

下载本文档

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

文档简介

装饰设计模式什么是装饰设计模式(Decoration design patterns)呢?当想要对已有的对象进行功能增强时,可以自定义类,将已有对象对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。我们知道IO流中Bufferedwrite()和BufferedReader就是属于装饰类的一种,现在我们通过一个简单程序来看看装饰设计模式的例子:/*以前人们出去都是走路在run方法里描述*/class Personpublic void run()System.out.println(走路);/*现代的人们出去的方式更多了以前的功能需要增强,自定义了一个增强类称为装饰类*/class ModernPersonprivate Person p;ModernPerson(Person p)this.p=p;public void run() /增强方法p.run();System.out.println(自行车);System.out.println(电动车);System.out.println(公交车);class DecorationDesignPatternsDemopublic static void main(String args) Person p=new Person();/p.run();需求不够,被弃用,使用装饰类里的增强型run方法ModernPerson mp=new ModernPerson(p);/将以前Person对象传给装饰类的构造方法mp.run();/增强性run方法。很多人就会疑惑了,我们可以使用继承去实现啊?但是如果使用继承的话,我们来看看继承的使用与装饰类的区别:我们假设一个体系MyReader是父类中的最顶层,父类下面有三个子类MyTxtReader,MyMediaReader,MyDataReader。而这三个类是由于功能上的不足,我们分别继承这三个类来增强功能。MyBufferedTxtReader,MyBufferedMediaReader,MyBufferedDataReader。我们看到一个MyReader体系:MyReader|-MyTxtReader|- MyBufferedTxtReader|- MyMediaReader|- MyBufferedMediaReader|- MyDataReader|- MyBufferedDataReader我们想通过一个类来使用传特定对象的方式,哪部分需要增强我们就传那部分的对象。所以看下面 class MyBufferedReaderMyBufferedReader(MyTxtReader text)MyBufferedReader(MyMediaReader media)MyBufferedReader(MyDataReader data)我们看到上面MyReader因为需求如果又出现了很多的子类,那么就又得在内部改代码,这样麻烦。可以看到上面的这个类扩展性极差。那么我们怎么办呢?我们想到我们何不找一个期参数的共同类型,通过一种多态的形式来提高扩展性。那么我们知道MyReader是父类的顶层,我们把他作为参数类型。class MyBufferedReader extends MyReader()MyBufferedReader(MyReader r);那么我又看到MyReader的体系发生了变化MyReader|-MyTxtReader|- MyMediaReader|- MyDataReader|-MyBufferedReader我们看到装饰模式比继承要灵活的多。避免了继承体系的臃肿。而且降低了类与类之间的关系。我们知道装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类都属于一个体系中的。其实我所说的就是IO流中体系,我们看看IO流中的装饰设计模式。我在这呢我复写了BufferedReader的readLine方法并继承了Reader类。import java.io.*;class MyBuffered extends Readerprivate Reader fr;MyBuffered(Reader fr)this.fr=fr;/复写了父类的readLinepublic String readLine()throws IOException StringBuilder sb=new StringBuilder();int i=0;while(i=fr.read()!=-1)if(i=r)continue;if(i=n)return sb.toString();elsesb.append(char)i);if(sb.length()!=0)return sb.toString();return null; /父类中的抽象方法必须要写public int read(char cbuf,int off,int len)throws IOExceptionreturn fr.read(cbuf,off,len); /父类中的抽象方法必须要写public void close()throws IOExceptionfr.close();class MyBufferedDemopublic static void main(String args) throws IOExceptionFileReader fr=new FileReader(BufferedW

温馨提示

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

评论

0/150

提交评论