一 什么是代理
代理(Proxy) 它是一种设计模式,提供了对目标对象另外的访问,即通过代理对象访问目标对象。这样做的好处就是可以在不改变目标对象实现前题下,增加额外的功能,即对目标对象的功能做扩展。
举个例子:我们需要在一个方法的执行前和执行后添加日志记录功能,在不使用代理时,我们的方法调用如下
此时,我们就需要修改当前的实现方法,不符合我们添加业务方法时不破换原有方法(目标对象)的设计思想。使用代理后,我们的方法调用如下
这个时候,我们调用的时代理对象,这时我们就只需要在在代理类中添加我们的逻辑而不需要去修改目标对象。
二 静态代理的实现
定义一个接口
1 public interface ICatDao { 2 3 /** 4 * 保存 5 */ 6 void save(); 7 8 }
接口的实现类(目标对象)
1 public class CatDaoImpl implements ICatDao { 2 3 @Override 4 public void save() { 5 System.out.println("保存信息"); 6 } 7 }
不使用代理,我们测试执行方法
1 public static void main(String[] args) { 2 //目标类 3 ICatDao userDao = new CatDaoImpl(); 4 5 userDao.save(); 6 7 }
如果要添加日志,我们就需要修改save方法,在里边添加相应的操作记录。
下来我们使用静态代理,创建一个静态代理对象
1 public class CatDaoProxy implements ICatDao { 2 3 /** 4 * 目标对象 5 */ 6 private ICatDao target; 7 8 /** 9 * 构造方法 10 */ 11 public CatDaoProxy(ICatDao userDao) { 12 this.target = userDao; 13 } 14 15 @Override 16 public void save() { 17 before(); 18 target.save(); 19 after(); 20 } 21 22 public void before(){ 23 System.out.println("方法调用前"); 24 } 25 26 public void after(){ 27 System.out.println("方法调用后"); 28 } 29 30 }
测试,修改之前的测试方法
1 public static void main(String[] args) { 2 //目标类 3 ICatDao userDao = new CatDaoImpl(); 4 //通过目标类,生成代理类 5 CatDaoProxy proxy = new CatDaoProxy(userDao); 6 //调用代理类实现的方法 7 proxy.save(); 8 }
执行结果
可以看到,我们没有修改save方法,也实现了在方法执行前和执行后添加日志记录。
原文地址:https://www.cnblogs.com/love-wzy/p/10163734.html
时间: 2024-11-08 22:44:21