代理是一种设计模式,提供了对目标对象另外的访问方式:即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需要修改,可以通过代理的方式来扩展该方法。
代理分为静态代理和动态代理。本文主要讨论静态代理。
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或继承相同的父类。
接口类:
package com.ant.jdk8.proxy; public interface UserDao { void save(); }
实现类:
package com.ant.jdk8.proxy; public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("保存用户"); } }
代理类:
package com.ant.jdk8.proxy; public class UserDaoProxy implements UserDao { private UserDao target; public UserDaoProxy(UserDao target){ this.target = target; } @Override public void save() { System.out.println("---开始事务---"); target.save(); System.out.println("---提交事务---"); } }
测试类:
package com.ant.jdk8.proxy; public class App { public static void main(String[] args) { UserDao target = new UserDaoImpl(); UserDaoProxy proxy = new UserDaoProxy(target); proxy.save(); } }
静态代理总结:
优点:
可以做到在不修改目标对象的功能前提下,对目标功能扩展。
缺点:
代理对象需要与目标对象实现同一个接口,所以会有很多代理类。同时,一旦接口增加方法,目标对象与代理对象都要维护。
动态代理可以解决静态代理的缺点。