当想给一个类的每个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