之前的模板方法虽然解决了代码多余的问题,但是缺点也是显而易见的,我只能*接收所有继承的,所以有了这第二个模式 装饰者模式
还是之前的业务逻辑,现在我可以这么写
public interface Command(){
public void excute();
}
//一个类来执行输出日志
public class Printlog implements Command(){
Command cmd;
public Printlog(Command cmd){
this.cmd=cmd;
}
@Override
public void excute(){
//日志
....
this.cmd.excute();
}
}
//一个类用来性能统计
public class Performance implements Command(){
Command cmd;
public Performance(Command cmd){
this.cmd=cmd;
}
@Override
public void excute(){
//性能统计
.....
this.cmd.excute();
}
}
public PlaceOrderCommand implements Command(){
@Override
public void excete(){
//下单操作
}
}
psvm{
//现在想下单的时候进行性能统计和打印日志
//理一下顺序 创建Printlog 需要Performance 创建Performance需要PlaceOrderCommand
//先创建PlaceOrderCommand 传入Performance 再创建Performance传入Printlog
//先执行Printlog的excete()方法,执行完日志操作之后 调用再执行Performance中的excute()方法,执行完日志操作之后 执行其中的excute()方法。
Command cmd=new Printlog (new Performance (new PlaceOrderCommand ()));
cmd.excute()
//如果只希望打印日志不希望进行性能统计
Command cmd=new Printlog (new PlaceOrderCommand ());
cmd.excute();
}
可以使用任意数量的装饰器,还可以任意次序执行。最终的业务逻辑放在最后,如果需要先执行业务逻辑再统计数据,也只需要更改本方法中的执行顺序而已。