模式——装饰设计模式"/>
设计模式——装饰设计模式
1.意义
1.1 意义:当想要对已有的对象进行功能增强时,可以自定义类,将已有对象传入,基于已有功能提供加强功能,那么自定义类称为装饰类
1.2 装饰相比继承的好处
<1>.继承思想实现增强类的过程如下:
MyReader =>专门用于读取数据的类
|--MyTextReader
|--MyBufferedTextReader
|--MyMediaReader
|--MyBufferedMediaReader
|--MyDataReader
|--MyBufferedDataReader
这是继承思想解决增强类的方法,当后期随着体系子类的逐渐增多,增强类也会随之增多,体系会越来越臃肿不堪
<2>.装饰设计思想实现增强类的过程如下:
MyReader =>专门用于读取数据的类
|--MyTextReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader
这样设计整个体系轻松易懂,装饰模式比继承要灵活,避免了继承体系的臃肿
1.3 特点:装饰类属于增强类,具备的功能与已有对象相同,只不过提供了更强的功能,所以装饰类和被装饰类通常都属于一个体系中,会继承体系的超累
1.4 注意:继承一个体系后,体系父类有抽象方法,装饰类复写抽象方法时,如果体系子类有实现的话,可以通过体系的子类来复写该方法
1.5 事实:装饰设计模式是把继承结构变成了组合结构
2.装饰类实现代码演示
class MyBufferedReader extends Reader
{ private Reader r; MyBufferedReader(Reader r){ this.r = r; } //可以每次读取一行的方法 public String myReadLine()throws IOException{ //原缓冲区是用的字符数组,这里为了方便用了StringBuilder StringBuilder sb = new StringBuilder(); int ch; while((ch=r.read())!=-1){ if(ch=='\r') continue; else if(ch=='\n') return sb.toString(); else sb.append((char)ch); } //当最后一行没有回车时不加下边语句,最后一行不会返回 if(sb.length()!=0) return sb.toString(); return null; } //父类的抽象方法。必须实现public void close()throws IOException{r.close();}//父类的抽象方法,必须实现public int read(char[] cbuf, int off, int len)throws IOException{return r.read(cbuf,off,len);//通过传入的体系子类来复写该方法}
}
更多推荐
设计模式——装饰设计模式
发布评论