当想给一个类的每个method进行扩充(统计、打印耗时)、拦截(判断是否登录)时:
常规思路
代理思路
可以使用代理(静态代理/动态代理),统一处理这类额外功能(非核心业务功能),让原来的代码仍然只关心最核心的业务逻辑。
代理类ServiceImplProxy和被代理类ServiceImpl实现同样的Service接口
代理类ServiceImplProxy持有被代理类ServiceImpl的引用
代理类ServiceImplProxy在接口方法中,填充扩展/拦截功能,核心逻辑依然由被代理类ServiceImpl的引用来完成
service 接口
public interface Service {
void play(String xxx);
String run(String xxx);
}
被代理类 ServiceImpl
public class ServiceImpl implements Service{
@Override
public void play(String xxx){
//....
}
@Override
public String run(String xxx){
//...
}
}
代理类 ServiceImplProxy
public class ServiceImplProxy implements Service{
private Service service;
//***关键*** 持有ServiceImpl的引用
public ServiceImplProxy() {
service = new ServiceImpl();
}
/**
* 扩展功能
*/
@Override
public void play(String xxx){
long start = System.currentTimeMillis();//计时开始
//***关键*** 执行真正的逻辑
service.play(xxx);
long end = System.currentTimeMillis();//计时结束
System.out.println("耗时:" + (end - start) + "毫秒");//打印耗时
}
/**
* 拦截功能
*/
@Override
public String run(String xxx){
//添加拦截逻辑
if("xxx".equals("...")){
//***关键*** 执行真正的逻辑
service.run(xxx);
}
//...
}
}
原文:https://www.cnblogs.com/frankcui/p/13875709.html