需求
为老业务系统添加计算接口的执行时间
解决办法
- 第一种解决: 使用模板设计模式来搞定
- 第二种解决: 使用装饰器设计模式来解决
- 第三种解决: 动态代理设计模式来搞定 (https://blog.csdn.net/qw4339829/article/details/102622860)
- 第四种解决: 使用Spring AOP
业务代码
//**老业务接口**
public interface MsgService {
String addMsg(String msg);
String updateMsg(String msg);
String delMsg(String msg);
String queryMsg(String msg);
}
//**老业务实现类**
public class MsgServiceImpl implements MsgService {
@Override
public String addMsg(String msg) {
System.out.println("addMsg : " + msg);
return msg;
}
@Override
public String updateMsg(String msg) {
System.out.println("updata :" + msg);
return msg;
}
@Override
public String delMsg(String msg) {
System.out.println("del :" + msg);
return msg;
}
@Override
public String queryMsg(String msg) {
System.out.println("query :" + msg);
return msg;
}
}
装饰器模式解决
public class MsgServiceHandle implements MsgService {
private MsgService msgService;
// 传入的参数相当于 new MsgServiceImpl()
public MsgServiceHandle(MsgService msgService) {
this.msgService = msgService;
}
@Override
public String addMsg(String msg) {
// 启动时间
long start = System.currentTimeMillis();
System.out.println("start...");
// 执行业务代码 等于 new MsgServiceImpl().ddMsg(msg)
String reps = msgService.addMsg(msg);
// 结束时间
long end = System.currentTimeMillis();
System.out.println("end...");
System.out.println("run time = " + (end - start));
return reps;
}
@Override
public String updateMsg(String msg) {
return null;
}
@Override
public String delMsg(String msg) {
return null;
}
@Override
public String queryMsg(String msg) {
return null;
}
}
Main
public class App {
public static void main(String[] args) {
// 装饰器模式实现
MsgService msgService = new MsgServiceHandle(new MsgServiceImpl());
msgService.addMsg("wow");
}
}
start...
addMsg : wow
end...
run time = 0
总结
装饰器模式其实就是引入实现类的接口,然后在其装饰类上扩展新增的功能,然后调用对应实现类的方法,比如装饰类 addMsg方法里面调用实现类的addMsg方法。
对比
同一个需求对比
装饰器模式与动态代理: 动态代理只需要增加两个类(为了代码简洁,可以一个方法搞定),就可以处理需要相同功能的接口。
而装饰器模式需要给每个接口都要写一个装饰器类,比如有 InfoService ,OrderSerice 等多个接口,就需要写多个装饰器类。