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

Rebecca ·
更新时间:2024-11-11
· 586 次阅读

  一、什么是装饰设计模式   当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的类成为装饰类。   装饰类通常会通过构造方法,传递进来一个需要装饰的对象,然后基于这个对象,提供更强大的方法。   下面是装饰设计模式的一个例子,自己写的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=='') continue; elseif(ch==' ') 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基础 JAVA 程序 设计模式 程序员

需要 登录 后方可回复, 如果你还没有账号请 注册新账号