代理是一种比较好的降低耦合的方式,恩、我感觉是;最近学习老师讲解了比较简单容易理解的例子,做个笔记吧
动态代理:
代理:
public class LogHandler implements InvocationHandler {
private Object targetObject;
public Object newProxyInstance(Object targetObject) {
this.targetObject = targetObject;
// 返回一个指定接口的代理类实例,定义代理类的类加载器 代理类要实现的接口列表 指派方法调用的调用处理程序
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke start--->" + method.getName());
for (int s = 0; s < args.length; s++) {
System.out.println(args[s]);
}
Object retObject = null;
try {
// 调用目标方法
retObject = method.invoke(targetObject, args);
System.out.println("invoke success---->" + method.getName());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
return retObject;
}
}
客户端:
public static void main(String[] args) {
LogHandler logHandler = new LogHandler();
UserManager userManager = (UserManager) logHandler
.newProxyInstance(new UserManagerImpl());//调用代理的newProxyInstance方法
userManager.addUser("0001", "张三");//通过动态代理调用方法
}
接口类很简单,不写了,也是为了系统的灵活
实现类:
public class UserManagerImplProxy implements UserManager {
private UserManager userManager;
public UserManagerImplProxy(UserManager userName) {
this.userManager = userName;
}
public void addUser(String userId, String userName) {
try {
System.out.println("UserManagerImplProxy start--->addUser() userId-->"+ userId);
userManager.addUser(userId, userName);
System.out.println("UserManagerImplProxy success-->addUser()");
} catch (Exception e) {
e.printStackTrace();
System.out.println("UserManagerImplProxy errror---->addUser()");
}
}
public void delUser(String userId) {
System.out.println("UserManagerImpl.delUser() userId --->" + userId);
}
public void modifyUser(String userId, String userName) {
System.out.println("UserManagerImpl.modifyUser() userId --->" + userId);
}
public String findUser(String userId) {
System.out.println("UserManagerImpl.findUser() userId --->" + userId);
return "张三";
}
}
结果:
invoke start--->addUser
0001
张三
UserManagerImpl.addUser() userId --->0001
invoke success---->addUser
静态代理
实现类一样,他的接口也是不变
public static void main(String[] args) {
// UserManager userManager = new UserManagerImpl();
// UserManager userManager = new UserManagerImplProxy(new
// UserManagerImpl());
// userManager.addUser("0001", "张三");
}
代理类
public class UserManagerImplProxy implements UserManager {
private UserManager userManager;
public UserManagerImplProxy(UserManager userName) {
this.userManager = userName;
}
public void addUser(String userId, String userName) {
try {
System.out
.println("UserManagerImplProxy start--->addUser() userId-->"
+ userId);
userManager.addUser(userId, userName);
System.out.println("UserManagerImplProxy success-->addUser()");
} catch (Exception e) {
e.printStackTrace();
System.out.println("UserManagerImplProxy errror---->addUser()");
}
}
public void delUser(String userId) {
System.out.println("UserManagerImpl.delUser() userId --->" + userId);
}
public void modifyUser(String userId, String userName) {
System.out.println("UserManagerImpl.modifyUser() userId --->" + userId);
}
public String findUser(String userId) {
System.out.println("UserManagerImpl.findUser() userId --->" + userId);
return "张三";
}
}
结果:
UserManagerImplProxy start--->addUser() userId-->0001
UserManagerImpl.addUser() userId --->0001
UserManagerImplProxy success-->addUser()
小结:
有一个博客写的很好,不班门弄斧了,直接粘贴过来:
代理(Proxy)设计模式提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.;这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明
星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.
目标对象没有实现接口时用Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展.
http://www.cnblogs.com/cenyu/p/6289209.html 点击打开链接