作用和应用场景:装饰者给被装饰者增加功能,实现功能扩展。如:
OutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(new File("D://aa.txt")));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
文件i/o读写是jdk使用装饰者模式经典案例,FileOutputStream已经实现了write文件的功能相当于被装饰者,BufferedOutputStream相当于装饰者,BufferedOutputStream给FileOutputStream增加了byte缓冲功能。用来提高i/o效率。
装饰者模式实现细则:1、装饰者和被装饰者实现同一个接口
2、装饰者的构造器以被装饰者为参数。
下面是装饰者模式的基本实现demo:
接口:
package designModel.decorator;
import java.util.List;
public interface Dao {
int insert();
List<Object> queryForList();
}
功能实现者(被装饰者):
package designModel.decorator;
import java.util.List;
public class UserDao implements Dao{
@Override
public int insert() {
// TODO Auto-generated method stub
return 0;
}
@Override
public List<Object> queryForList() {
// TODO Auto-generated method stub
return null;
}
}
装饰者:
package designModel.decorator;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
public class DecorateDao implements Dao{
private UserDao user;
public DecorateDao(UserDao user) {
this.user = user;
}
@Override
public int insert() {
beforeInsert();//在新增操作前处理的业务
int insertNum = user.insert();
AfterInsert();//在新增操作之前处理的业务
return insertNum;
}
@Override
public List<Object> queryForList() {
beforeQuery();//在query之前的业务
List<Object> list = user.queryForList();
AfterQuery();//在query之后的业务
return list;
}
public void beforeInsert() {
System.out.println("在 before insert 时 do something");
}
public void AfterInsert() {
System.out.println("在 After insert 时 do something");
}
public void beforeQuery() {
System.out.println("在 before Query 时 do something");
}
public void AfterQuery() {
System.out.println("在 After Query 时 do something");
}
}
注释:此例子主要实现在新增和查询前后进行记录日志。