一、装饰者模式
1.定义:一种思想,通过装饰,对原来功能进行升级
2.装饰者模式流程
a.把被装饰者,写成成员变量
b.构造方法中,给该成员变量赋值
c.对原有功能进行升级
3.继承也可以实现功能的升级,那么装饰者模式好处
a.高内聚(类中方法之间的联系--联系最后紧密)
b.低耦合(解耦)(类和类之前,尽量不要产生联系)
例题1:使用LineNumberReader
public static void fun1() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
LineNumberReader lnr = new LineNumberReader(fr);
lnr.setLineNumber(101);
String string = "";
while((string = lnr.readLine()) !=null) {
System.out.println(lnr.getLineNumber()+":"+string);
}lnr.close();
}
例题2:利用装饰者,实现LineNumberReader
public static void fun2() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/tes/znb.txt");
wsLineNumberReader lnr = new wsLineNumberReader(fr);
lnr.setNum(100);
String string = "";
while((string = lnr.myRead())!=null) {
System.out.println(lnr.getNum()+":"+string);
}
lnr.myClose();
}
class wsLineNumberReader {
private Reader reader;
private int num = 0;
public wsLineNumberReader() {
}
public wsLineNumberReader(Reader reader) {
super();
this.reader = reader;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String myRead() throws IOException {
num++;
StringBuilder stringBuilder = new StringBuilder();
int len = 0;
while((len = reader.read())!=-1) {
if (len =='\n') {
return stringBuilder.toString();
}else {
stringBuilder.append((char)len);
}
}
if(stringBuilder.length()==0) {
return null;
}
return stringBuilder.toString();
}
public void myClose() throws IOException {
reader.close();
}
}
二、打印流(只能输出-原样输出)
1.PrintStream--字节打印流
构造方法可接受的参数:
a.文件
b.字节输出流(OutputStream)
c.文件路径
2.PrintWriter--字符打印流
3.特点
a.只能作为数据的目的地
b.可以把数据原样输出
c.永远不会抛出IO异常,但会抛出其他异常
d.相当于Print打印流类,可以给其他流类对象,装饰一个原样输出的功能
例题1:
public static void fun1() throws FileNotFoundException {
File file =new File("/Users/lanou/Desktop/tes/haha.txt");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
ps.println("wanglong");
ps.println(true);
ps.println(100);
ps.println(3.5);
ps.println("p");
ps.write(100);
ps.close();
}
例题2: 打印字符流
public static void fun2() throws FileNotFoundException {
File file =new File("/Users/lanou/Desktop/tes/haha.txt");
FileOutputStream fos = new FileOutputStream(file);
PrintWriter pw = new PrintWriter(fos);
pw.println("nihao");
pw.println(11);
pw.println(true);
pw.write(78);
pw.flush();
pw.close();
}