java中装饰者模式
package com.company01.Decorator;
public abstract class Reader {
public abstract void close();
}
package com.company01.Decorator;
/*
需求:对FileReader类中close()方法进行扩展,并且不能改变FileReader
1.使用继承(但是关联性太强了,代码耦合度太高,不利于项目的扩展。)-->可以理解为 父子关系
2.这里介绍一种方法:装饰者模式。-->可以理解为朋友之间的关系
*/
public class FileReader extends Reader {
public void close(){
System.out.println("FileReader closed!");
}
}
package com.company01.Decorator;
/*
使用BufferedReader对FileReader中的close方法进行扩展
1.装饰者模式中要求:装饰者中含有被装饰者的引用
2.装饰者模式中要求:装饰者和被装饰者应该实现同一个接口或者类型。
*/
public class BufferedReader extends Reader{ // BufferedReader 装饰者
//FileReader reader; // FileReader 就是被装饰者
// 这里也可以使用多态
Reader reader;
// Constructor
//BufferedReader(FileReader reader){
BufferedReader(Reader reader){
this.reader = reader;
}
// 对FileReader中的close方法进行扩展
public void close(){
//扩展
System.out.println("扩展代码1");
reader.close();
System.out.println("扩展代码2");
}
}
package com.company01.Decorator;
/*
【注】通过这个例子明白:
为什么在前面讲的 包装流 或者 处理流 中,只需要关闭外层的流就可以了,不需要关闭内层的。
这是因为装饰者模式
*/
public class DecoratorTest {
public static void main(String[] args) {
/*
// 1.创建被装饰者
FileReader fr = new FileReader();
// 2.创建装饰者
BufferedReader br = new BufferedReader(fr);
*/
// 其实就是
BufferedReader br = new BufferedReader(new FileReader());
// 3.通过执行装饰者中的方法间接去执行被装饰者中的方法
br.close();
/*
扩展代码1
FileReader closed!
扩展代码2
*/
}
}