java的静态与动态代理
即将学习框架所以算是比较认真的理解了一番代理并整理了下下。
代理模式是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。 所以代理可以作函数执行前的拦截器,代理执行原对象方法的前后可以外加一些东西,典型应用:日志记录,在一 个方法执行成功或失败的前后都可以记录。
Part I.静态代理
首先我们看静态代理的实现:定义接口:UserManager 抽象角色
package info.vzless.proxy; public interface UserManager { //添加用户 public void addUser(String username, String password); //修改用户 public void modify(String userId, String username, String password); }
真实角色UserManager接口的实现
package info.vzless.proxy; public class UserManagerImpl implements UserManager { public void addUser(String username, String password) { //System.out.println("start--->>addUser() - username=" + username); try { //调用dao....... System.out.println("UserManagerImpl.addUser()"); //System.out.println("end--->>addUser() "); }catch(Exception e) { e.printStackTrace(); throw new java.lang.RuntimeException(); //System.err.println("error--->>addUser()"); } } public void modify(String userId, String username, String password){ try { //调用dao....... System.out.println("UserManagerImpl.modify()"); }catch(Exception e) { e.printStackTrace(); } } }
具体的客户端调用:
package info.vzless.proxy; public class Client { /** * @param args */ public static void main(String[] args) { //UserManager userManager = new UserManagerImpl(); UserManager userManager = new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("张三", "123"); } }
后来可能因为业务需要,我们需要添加日志功能,好的,我们最笨的做法就是如UserManager接口的实现UserManagerImpl的addUser()方法中的注释部分一样,在每个方法的调用前后添加代码。软件开发有一个开闭原则(OCP)就是说对扩展开放,对修改关闭。所以我们不应该对原来的代码进行修改,因为修改后我们还要对原来的代 码改变进行测试,可谓劳民伤财。现在我们来用静态代理解决(仅对addUser方法举例说明) more…
