静态、动态代理实例

代理是一种比较好的降低耦合的方式,恩、我感觉是;最近学习老师讲解了比较简单容易理解的例子,做个笔记吧

动态代理:

代理:

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 点击打开链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值