1.1 当想要对已有的对象进行功能增强时
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能
那么自定义的类称之为装饰类。
1.2 装饰通常通过构造方法接收被装饰的对象
并基于被装饰的对象的功能,提供更强的功能
1.3 装饰和继承的区别
Reader:专门读取数据的类
数据分很多种,
所以有 TxtReader 、MediaReader等等
加入缓冲技术
BufferedTxtReader
BufferedMediaReader
这样会导致体系臃肿,为了避免这种现象,单独将缓冲进行封装,哪个对象需要缓冲就将哪个对象和缓冲关联。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能
所以装饰类和被装饰类通常是都属于一个体系中的
继承可以用,但是不要太多,可以结合装饰类使用。
2. 示例
自定义一个BufferedReader
*
自定义一个类中包含一个功能和readline一致的方法
模拟一下BufferedReader
*/
package day19;
import java.io.*;
public class H_05MyBufferedReader {
public static void main(String[] args) {
}
}
class MyBufferedReader extends Reader//使用基类
{
private Reader r;
MyBufferedReader(Reader r)//使用基类对象 对其进行装饰
{
this.r=r;
}
public String myReadLine() throws IOException
{
//定义一个临时容器,原BufferedReader封装的是字符数组
//为了演示方便,定义一个sb容器,再将数据变成字符串
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=r.read())!=-1)
{
if(ch=='\r')
continue;
else if(ch=='\t')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
/*
* 需要变成体系 继承Reader
* 就要覆盖Reader体系里的抽象方法
*/
public void close() throws IOException {//复写Reader的方法
r.close();
}
public int read(char[] arg0, int arg1, int arg2) throws IOException {
return r.read(arg0, arg1, arg2);
}
}
示例二 自定义LineNumberReader
import java.io.*;
public class H_10MyLineNumberReader {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("Demo.txt");
MyLineNumberReader lnr=new MyLineNumberReader(fr);
String line=null;
while((line=lnr.myReaderLine())!=null)
{
System.out.println(lnr.getLineNumber()+line);
}
lnr.close();
}
}
class MyLineNumberReader extends Reader
{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r)
{
this.r=r;
}
public String myReaderLine() throws IOException
{
lineNumber++;//调用一次,自增一次
StringBuilder sb=new StringBuilder();
int ch=0;
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 setLineNumber(int lineNumer)
{
this.lineNumber=lineNumber;
}
public int getLineNumber()
{
return lineNumber;
}
public void close() throws IOException {
// TODO Auto-generated method stub
r.close();
}
public int read(char[] cbuf, int off, int len) throws IOException {
// TODO Auto-generated method stub
return 0;
}
}