1 - 为什么需要代理?
当想给一个类的每个 method 进行扩充 (统计, 打印耗时), 拦截(判断是否登录) 时:
常规思路
修改了原来的代码逻辑
每个涉及的 method 都需要改动, 改动量很大
代理思路
可以使用代理(静态代理 / 动态代理), 统一处理这类额外功能(非核心业务功能), 让原来的代码仍然只关心最核心的业务逻辑.
2 - 静态代理
关键点
代理类 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);
- }
- //...
- }
- }
来源: http://www.bubuko.com/infodetail-3685886.html