1.装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,
将已有对象传入,基于已有的功能,并提供加强功能
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰模式比继承要灵活,避免了继承体系臃肿。
而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。所以装饰类和被装饰类通常是
都属于一个体系中的。
class Person
{
public void chifan()
{
System.out.println("吃饭");
}
}
class SuperPerson
{
private Person p;//定义一个Person类类型属性
SuperPerson(Person p) // 构造函数
{
this.p = p;
}
public void superChifan()
{
System.out.println("开胃酒");
p.chifan(); // 直接调用Person中方法
System.out.println("甜点");
System.out.println("来一根");
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();//new一个p对象;
SuperPerson sp = new SuperPerson(p);//这个p是new出来的p,
sp.superChifan();
}
}
2.使用LineNumberReader()中的方法,读取行号,可使用的方法为getLineNumber()和setLineNumber();
import java.io.*;
class LineNumberReaderDemo
{
public static void main(String[] args)throws IOException
{
FileReader fr = new FileReader("PersonDemo.java");
LineNumberReader lnr = new LineNumberReader(fr);//建立LineNumberReader,并传入字节流对象
String line = null;
lnr.setLineNumber(100);//设置行号初始数为100(不包含),从101开始
while((line=lnr.readLine()) != null)
{
System.out.println(lnr.getLineNumber()+":"+line);
//获取行号从1号开始输出 ,输出行号和内容
}
lnr.close();
}
}
3.练习:模拟一个带行号的缓冲区对象
import java.io.*;
class MyLineNumberReader
{
private Reader r;
private int lineNumber;
MyLineNumberReader(Reader r)
{
this.r = r;
}
public String myReadLine()throws IOException
{
lineNumber++; //行号自增。
StringBuilder sb = new StringBuilder();//建立StringBuilder容器,并创建对象
int ch = 0;
while((ch=r.read()) != -1)//while循环判断文件是否为空
{
if(ch == '\r')
continue;
if(ch == '\n')
return sb.toString();
else
sb.append((char)ch); //添加数据
}
if(sb.length() != 0)
return sb.toString();
return null;
}
public void setLineNumber(int lineNumber)//设置行号
{
this.lineNumber = lineNumber;
}
public int getLineNumber()//获取行号
{
return lineNumber;
}
public void myClose()throws IOException //自定义关闭流对象方法
{
r.close();
}
}
class MyLineNumberReaderDemo
{
public static void main(String[] args)throws IOException
{
FileReader fr = new FileReader("PersonDemo.java");
MyLineNumberReader mylnr = new MyLineNumberReader(fr); //创建MyLineNumberReader对象,并传入流对象
String line = null;
mylnr.setLineNumber(100); //设置行号
while((line = mylnr.myReadLine()) != null)
{
System.out.println(mylnr.getLineNumber()+"::"+line);//输出行号和内容
}
mylnr.myClose();
}
}
个人总结:装饰设计模式是是增强功能,通常用构造方法接收被装饰的对象,比继承更灵活,减少类之间的关系
掌握行号的输出方法,利用LineNumberReader()方法创建对象,使用setLineNumber()设置行号和
getLineNumber()获取行号的方法 了解LineNumberReader()内部运行原理,并能用代码实现