装饰者模式(设计者模式)
1.装饰者模式
思想: 可以通过装饰 对原来的功能进行升级
例如:
BufferedOutputStream 传入的参数是 FileOutputStream
相当于把FileOutputStream装饰了 装饰后 功能得到提升 写入效率提高
装饰者模式流程:
(1).把被装饰者写成成员变量
(2).构造方法中 给该成员变量赋值
(3).对原有功能升级
装饰者模式的好处:
高内聚(类中的方法之间的联系做好紧密)
低耦合(解耦)(类和类之间 尽量不要产生联系)
class MyLineNumberReader {
private Reader reader;
private int num = 0;
public void getNum(){
}
public void setNum(int num){
this.num = num;
}
public WLLineNumberReader() {
}
public WLLineNumberReader(Reader reader) {
this.reader = reader;
}
public String myRead() throws IOException{
num++;
StringBuilder sb = new StringBUilder();
int len = 0;
while((len = reader.read()) != -1){
if(len = '\n'){
return sb.toString();
}else{
sb.appened((char)len);
}
}
if(sb.length() == 0){
return null;
}
return sb.toString();
public void myclose() throw IOEXception{
reader.close();
}
}
LineNumberReader
2.跟踪行号的缓冲字符输入流LineNumberReader
特点:能跟踪行号
public static void fun1() throws FileNotFoundException, IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/Test/znb.txt");
LineNumberReader lnr = new LineNumberReader(fr);
lnr.setLineNumber(10);
String string = "";
While((string = lnr.read()) != null){
System.out.println(lnr.getLineNumber() + ":" + string);
}
lnr.close();
}
}
打印流
3.打印流(只能输出)
(1)只能作为数据的目的地
(2)可以把数据原样输出
(3)永远不会抛出IO异常
但是 会抛出其他异常 例如空指针
(4)打印流相当于 可以给其他的流对象 装饰一个 原样输出的功能
PrintStream(字节输出)
构造方法可接收的参数:
1.文件(File)
2.文件输出流(OutputStream)
3.文件路径
PrintWriter(字符输出)
System.in 是 BUfferInputStream 缓冲输入字节流
作品:接收键盘输入的内容
System.out 是 PrintStream 打印输出字节流
作用:输出内容到控制台
File file = new File("/Users/lanou/Desktop/Test/haha.txt");
PrintWriter pw = new PrintWriter(file);
pw.print("haha");
pw.println(200);
pw.println(false);
pw.flush();
pw.close();
File file = new File("/Users/lanou/Desktop/Test/haha.txt");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
ps.println("wanglong");
ps.println(true);
ps.print(100);
ps.write(100);
ps.print('p');
ps.close();
public static void main(String[] args) throws IOException {
System.out.println("请输入");
InputStream in = System.in;
StringBuilder sb = new StringBuilder();
int len = 0;
while(true){
if(sb.toString().endWith("quit")){
break;
}
len = in.read();
if(len == '\n'){
System.out.println(sb.toString());
sb.delete(0,sb.length());
}else {
sb.append((char)len);
}
}
}