黑马程序员:java基础之装饰设计模式

  一、什么是装饰设计模式

  当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类。

  装饰类通常会通过构造方法,传递进来一个需要装饰的对象,然后基于这个对象,提供更强大的方法。

  下面是装饰设计模式的一个例子,自己写的MyBufferedReader,并提供了myReadLine方法,IO包中类BufferedReader采用原理也是类似的。

  

  /*

  装饰设计模式:MyBufferedReader

  */

  importjava.io.*;

  classMyBufferedReader

  {

  privateFileReaderfr;

  MyBufferedReader(FileReaderfr)

  {

  this.fr=fr;

  }

  publicStringmyReadLine()throwsIOException

  {

  StringBuildersb=newStringBuilder();

  intch;

  while((ch=fr.read())!=-1)

  {

  if(ch==’\r’)

  continue;

  elseif(ch==’\n’)

  returnsb.toString();

  else

  sb.append((char)ch);

  }

  if(sb.length()!=0)

  returnsb.toString();

  returnnull;

  }

  publicvoidmyClose()throwsIOException

  {

  fr.close();

  }

  }

  classMyBufferedReaderDemo

  {

  publicstaticvoidmain(String[]args)throwsIOException

  {

  FileReaderfr=newFileReader(“test.txt”);

  MyBufferedReaderbr=newMyBufferedReader(fr);

  Stringline=null;

  while((line=br.myReadLine())!=null)

  {

  System.out.println(line);

  }

  br.myClose();

  }

  }

   二、装饰和继承的区别

  装饰设计模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。

  装饰类因为增强已有对象,具备的功能与已有对象是相同的,只不过提供了更强的功能。所以装饰类和被装饰类通常

  是属于同一个体系的。

  如下所示:

  

  MyReaderMyReader

  |–MyTextReader|–MyTextReader

  |–MyBufferedTextReader|–MyMediaReader

  |–MyMediaReader|–MyBufferedReader

  |–MyBufferedMediaReader

  如果为了改进一些功能而继承,就可能导致整个继承树过于臃肿,同时要考虑事物之间是否是父类和子类的关系。

  在IO包中,还有一个LineNumberReader,继承了BufferedReader,复用了其中功能(readLine),同时是FileReader的装饰类。如果想要获取所读文件中的行数,可以用这个装饰类,其中主要提供了了setLineNumber(),getLineNumber()方法。

没有什么可留恋,只有抑制不住的梦想,

黑马程序员:java基础之装饰设计模式

相关文章:

你感兴趣的文章:

标签云: