装饰者模式:在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案(扩展原有对象功能)
注意:
装饰者模式要求:1.装饰者中含有被装饰者的引用 2.装饰者和被装饰者应该实现同一个接口(类型)
使用场景:
适用于给一个类或者对象扩展功能!
例子:
public abstract class Reader
{
public abstract void close();
}
//思考:对FileReader这个类的close方法进行扩展:
//1.继承(不推荐,代码耦合度太高。不利于项目的扩展。)
//2.装饰者模式.
public class FileReader extends Reader
{
public void close(){
System.out.println("FileReader closed!");
}
}
//使用BufferedReader对FileReader中的close方法进行扩展
//1.装饰者模式中要求:装饰者中含有被装饰者的引用.
//2.装饰者模式中要求:装饰者和被装饰者应该实现同一个接口(类型).
public class BufferedReader extends Reader //BufferedReader 装饰者
{
//关联关系
Reader reader; //FileReader就是被装饰者.
//Constructor
BufferedReader(Reader reader){//Reader reader = new FilerRead()
this.reader = reader;
}
//对FileReader中的close方法进行扩展
public void close(){
//扩展
System.out.println("扩展代码1");
reader.close();
System.out.println("扩展代码2");
}
}
public class Test02
{
public static void main(String[] args){
/*
//1.创建被装饰者
FileReader fr = new FileReader();
//2.创建装饰者
BufferedReader br = new BufferedReader(fr);
*/
BufferedReader br = new BufferedReader(new FileReader());
//3.通过执行装饰者中的方法间接去执行被装饰者中的方法.
//就不用关闭FileRead()中的close方法
br.close();
}
}