1、简述:当想对已有对象进行功能增强是,可定义类:将已有对象传入,基于已有对象的功能,并提供加强功能,那么自定义的该类称之为装饰类。即对原有类进行了优化。
装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能
那么自定义的该类称为装饰类
装饰类通常会通过构造方法接受被装饰的对象
并基于被装饰的对象的功能,提供更详细的功能。
2、特点:装饰类通常都会通过构造方法接收被装饰的对象,并基于被装饰的对i型那个的功能提供更强的功能。
3、装饰和继承的区别:
1)装饰模式比继承要灵活,通过避免了继承体系的臃肿,且降低了类与类间的关系。
2)装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能,所以装饰类和被装饰的类通常都是属于一个体系。
3)从继承结构转为组合结构。
注:在定义类的时候,不要以继承为主;可通过装饰设计模式进行增强类功能。灵活性较强,当装饰类中的功能不适合,可再使用被装饰类的功能。
要继承相应的父类,就需要将所有的抽象方法实现,或交给子类实现。其中毕老师写的MyBufferedReader的例子就是最好的装饰设计模式的例子,就是 对BufferedReader的增强。- /*
- 明白了BufferedReader类中特有方法readLine的原理后,
- 可以自定义一个类中包含一个功能和readline一致的方法
- 来模拟一下BufferedReader
- */
- import java.io.*;
- class MyBufferedReader extends Reader
- {
-
- //装饰设计模式
- private Reader r=null;
-
- MyBufferedReader(Reader r)
- {
- this.r=r;
- }
- //可以一次读一行数据的方法
- public String myReadLine() throws IOException
- {
- //定义一个临时容器,员BufferedReader封装的是字符数组
- //为了演示方便,定义一个StringBulilder容器,因为最终还是要将数据变成字符串。
- StringBuilder sb=new StringBuilder();
- int ch=0;
- while((ch=r.read())!=-1)
- {
- if(ch=='\r')
- continue;
- if(ch=='\n')
- return sb.toString();
- else
- sb.append((char)ch);
- }
- //如果没有遇到\n,sb中而且有数据的话也要返回
- if(sb.length()!=0)
- return sb.toString();
- return null;
- }
- /*
- 覆盖类中的抽象方法
- */
- public int read(char[] cbuf,int off,int len)throws IOException
- {
- return r.read(cbuf,off,len);
- }
-
- public void close() throws IOException
- {
- r.close();
- }
-
- public void myClose() throws IOException
- {
- r.close();
- }
- }
- class MyBufferedReaderDemo
- {
- public static void main(String[] args) throws IOException
- {
- FileReader fr=new FileReader("buf.txt");
-
- MyBufferedReader myBuf=new MyBufferedReader(fr);
-
- String line=null;
-
- while((line=myBuf.myReadLine())!=null)
- {
- System.out.println(line);
- }
-
- myBuf.myClose();
- }
-
- }
复制代码 |