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)装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。
- java装饰设计模式的由来
- JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化
- 装饰者模式的由来
- Java装饰设计模式
- Java 装饰设计模式
- Java 装饰设计模式
- java 装饰设计模式
- Java 装饰设计模式
- java 装饰设计模式
- Java装饰设计模式
- Java 装饰设计模式
- Java装饰设计模式
- Java 设计模式 --装饰模式
- Java 设计模式-----装饰模式
- java设计模式-装饰模式
- java设计模式---装饰模式
- java设计模式-装饰模式
- 【Java设计模式】装饰模式
- 蓝桥杯 第39级台阶 dfs
- jndi调用时,各种应用服务器InitialContext的写法
- C#+Arcengine实现GP工具中的extract by mask(提取掩膜),可以实现提取shp范围的栅格数据,可用来获得shp范围的高程
- LayoutInflater.inflate方法解析
- 杭电2015 偶数求和
- java装饰设计模式的由来
- return的用法
- 当有过滤器链的时候根据在web.xml配置文件的配置顺序,一个一个得拦截目标
- 【单链表】环的入口点
- 算法路线_2
- 数据库数据 - - - - 中国省份和市
- 1-Java创建线程
- HDOJ-1299-Diophantus of Alexandria 解题报告
- OpenCart V2.x中文语言包安装教程