首页 > 编程语言 > 详细

Java 基础 - 静态代理 VS 动态代理

时间:2020-10-25 23:24:58      阅读:51      评论:0      收藏:0      [点我收藏+]

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);
		}
		//...
	}

}

 

Java 基础 - 静态代理 VS 动态代理

原文:https://www.cnblogs.com/frankcui/p/13875709.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!