java装饰设计模式的由来

来源:互联网 发布:php广告位 设计 编辑:程序博客网 时间:2024/05/22 06:10


装饰设计模式:基于已经存在的功能,提供增强的功能

装饰设计模式的由来:

Reader

  ----TextReader

 ----MediaReader

要为子类提供缓冲读的功能

Reader

  ----TextReader

       ----BufferedTextReader

  ----MediaReader

      -----BufferedMediaReader

Reader

  ----TextReader

       ----BufferedTextReader

  ----MediaReader

      -----BufferedMediaReader

  ----OtherReader

      -----BufferedOtherReader

 

既然都是提供缓冲读的功能,那么就可以把这个功能提取出来,单独定义成一个类

谁需要被提高效率,就把谁作为参数传递给这个类的构造方法

class BufferedReader

{

   privateReader r;

 

   publicBufferedReader(Reader r)

   {

         this.r = r;

   }

}

这个体系就成了下边的样子:

Reader

  ----TextReader


  ----MediaReader


  ----OtherReader


  ----BufferedReader

   

 装饰设计模式的特点:

 1:因为是基于已有的功能提供增强的功能,所以还属于原体系

 2:是一个体系简单化了

例子说明:

import java.io.*;//实现LineNumberReaderclass MyBufferedReader //extends Reader{private Reader r;//真正用来读取文件的private char[] arr = new char[1024];//相当于缓冲区private int index;//数组使用的下标private int count;//存储字符个数的变量public MyBufferedReader(Reader r){this.r = r;}//实现一次读一个字符的功能public int myRead()throws IOException{   //如果缓冲区中没有数据,从文件中读取数据到缓冲区   if(count==0){        count = r.read(arr);//从文件中读取数据到缓冲区,返回的是读取的字符的个数            index = 0;//下标重置为0,从文件中读了一批数据,从下标0开始取    }if(count<0)return -1;//从缓冲区中取一个字符int num = arr[index];//下标加1index++;//数量减1count--;return num;}//实现一次读一行的功能//反复调用myRead(),不够一行的时候存储,够一行的时候返回public String myReadLine()throws IOException{  //使用StringBuilder实现存储  StringBuilder sb = new StringBuilder();          int ch;  while((ch=myRead())!=-1)  {      if(ch=='\r')  continue;  else if(ch=='\n')  return sb.toString();  else  sb.append((char)ch);  }  return null;}public void myClose()throws IOException{r.close();}}class MyLineNumberReader extends  MyBufferedReader{private int lineNumber;public MyLineNumberReader(Reader r){super(r);}    public void setLineNumber(int lineNumber){this.lineNumber = lineNumber;}public int getLineNumber(){return this.lineNumber;}public String myReadLine()throws IOException    {    ++lineNumber;return super.myReadLine();}}class  Demo7{public static void main(String[] args)throws IOException {FileReader fr = new FileReader("Demo5.java");//是一个装饰类MyLineNumberReader lnr = new MyLineNumberReader(fr);String line = null;lnr.setLineNumber(99);while((line = lnr.myReadLine())!=null){System.out.println(lnr.getLineNumber()+":"+line);}lnr.myClose();}}

1)继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。

2)在设计中,应该允许行为可以被扩展,而无须修改现有的代码。

3)组合和委托可用于在运行时动态地加上新的行为。

4)除了继承,装饰者模式也可以让我们扩展行为。

5)装饰者模式意味着一群装饰者类,这些类用来包装具体组件。

6)装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。

7)装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

8)可以用无数个装饰者包装一个组件。

9)装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。

10)装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。



 

0 0
原创粉丝点击