装饰者模式(设计模式)
思想:可以通过装饰对原来的功能进行升级
例如:BufferedOutputstream
需要Outputstream构造
可以使FileOutputStream(被装饰者)功能得到提升 相当于装饰后,写入效率提高了
ObjectOutputstream
需要Outputstream构造
可以使FileOutputStream被装饰后功能提升,即可以写对象
装饰者模式流程
1.把被装饰者写成成员变量
2.构造方法中给该成员变量赋值
3.对原有功能的升级
装饰者模式的好处
高内聚:类中方法之间的联系 联系最好紧密
低耦合(解耦):类与类之间尽量不要产生联系
代码示例:
public class Demo01 {
public static void main(String[] args) {
LOStudent student = new LOStudent(new Student());
student.code();
LXStudent student2 = new LXStudent(new Student());
student2.code();
}
}
interface Coder{
public abstract void code();
}
class Student implements Coder{
@Override
public void code() {
System.out.println("c");
System.out.println("c++");
System.out.println("c#");
}
}
class LOStudent implements Coder{
private Student student;
public LOStudent() {}
public LOStudent(Student student) {
super();
this.student = student;
}
@Override
public void code() {
student.code();
System.out.println("java");
System.out.println("html");
System.out.println("js");
}
}
class LXStudent implements Coder{
private Student student;
public LXStudent() { }
public LXStudent(Student student) {
super();
this.student = student;
}
@Override
public void code() {
student.code();
System.out.println("电竞");
System.out.println("汽修");
System.out.println("挖掘机");
}
}
LineNumberReader
特点:能获取行号
代码示例:
FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
LineNumberReader lnr = new LineNumberReader(fr);
String len = "";
while ((len = lnr.readLine()) != null) {
System.out.println(lnr.getLineNumber() + ":" + len);
}
lnr.close();
利用装饰者实现LineNumberReader
class MyLineNumberReader {
private Reader reader;
private int num = 0;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public MyLineNumberReader() {
}
public MyLineNumberReader(Reader reader) {
super();
this.reader = reader;
}
public String myRead() throws IOException {
num++;
StringBuilder stringBuilder = new StringBuilder();
int len = 0;
while ((len = reader.read()) != -1) {
if (len == 10) {
return stringBuilder.toString();
} else {
stringBuilder.append((char)len);
}
}
if (stringBuilder.length() == 0) {
return null;
}
return stringBuilder.toString();
}
public void myClose() throws IOException {
reader.close();
}
}
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("/Users/lanou/Desktop/test/ppp.txt");
MyLineNumberReader mnr = new MyLineNumberReader(fr);
mnr.setNum(100);
String len = "";
while ((len = mnr.myRead())!=null) {
System.out.println(mnr.getNum() + len);
}
mnr.myClose();
}
打印流
PrintStream(字节)
构造方法可接受的参数:
1.文件(File)
2.字节输出流(OutputStream)
3.文件路径
PrintWriter(字符)
1.只能作为数据的目的地
2.可以把数据原样输出
3.永远不会抛出IO异常 但是可以抛出其他异常 例如空指针
4.打印流相当于可以给其他的流对象装饰一个原样输出的功能
System.in 是BufferedInputStream 缓冲输入字节流
作用:接受键盘输入的内容
System.out 是PrintStream 打印输出字节流
作用:输出内容到控制台
public static void main(String[] args) throws IOException {
File file = new File("/Users/lanou/Desktop/test/ppp.txt");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(bos);
ps.println("hahaha");
ps.println(true);
ps.print(100);
ps.print(3.5);
ps.write(100);
ps.println('p');
ps.close();
}
public static void main(String[] args) throws IOException {
File file = new File("/Users/lanou/Desktop/test/ppp.txt");
PrintWriter pw = new PrintWriter(file);
pw.println("hah");
pw.println(100);
pw.print(true);
pw.flush();
pw.close();
}
public static void main(String[] args) throws IOException {
System.out.println("请输入");
InputStream in = System.in;
StringBuilder stringBuilder = new StringBuilder();
while (true) {
if (stringBuilder.toString().endsWith("quit")) {
break;
}
int len = in.read();
if (len == 10) {
System.out.println(stringBuilder.toString());
stringBuilder.delete(0, stringBuilder.length());
} else {
stringBuilder.append((char)len);
}
}
}