`
TechBirds
  • 浏览: 82593 次
文章分类
社区版块
存档分类
最新评论

代理设计模式之(静态代理+Java自身提供的动态代理机制)

 
阅读更多

参考:http://blog.csdn.net/hivon/article/details/576691

静态代理和动态代理的概念:

由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态创建而成。
1.代理模式使用的原因:当类违反单一职责原则时,就要去考虑是否采用代理模式实现。
public class ViewAction {
 	/*
 	 * 设计缺陷:
 	 * 		一个类中有两个功能1.验证激活 2.执行具体操作
 	 * 违反:单一职责原则
 	 * 因此:引入代理机制
 	 * 
 	 */
 	public void doAction(User user){
 		//假如用户被激活,则做view操作
 		if(user.isActive()){
 			System.out.println("do the viewAction!");
 		}
 	}
 }
2.引入代理模式(静态代理):解决类违反单一职责原则,使类专注于自己的核心操作
public class AddAction {
 	public void doAction(User user) {
 		//添加操作
 		System.out.println("add..");
 	}
 }
public class ProxyAddAction extends AddAction {
 	AddAction action = new AddAction();
 	@Override
 	public void doAction(User user) {
 		if (user.isActive()) {
 			// 代理执行
 			action.doAction(user);
 		}
 	}
 }
3.代理模式的优化(静态代理):虽然每一个动作都不相同,但是我们仍可以抽象出一个动作接口。利于系统的扩展。
public interface IAction {
 	public void doAction(User user);
 }
public class AddAction implements IAction {
 	@Override
 	public void doAction(User user) {
 		//添加操作
 		System.out.println("add..");
 	}
 }
public class ProxyAction implements IAction {
 	private IAction action;
 	public ProxyAction(IAction action) {
 		this.action = action;
 	}
 	@Override
 	public void doAction(User user) {
 		if (user.isActive()) {
 			// 代理执行,本质上还是有实现类进行执行
 			action.doAction(user);
 		}
 	}
 }
4.动态代理引入的原因:
	不仔细深入会觉得与3区别不大,但是确实代理类的编写上灵活很多,因为很多时候系统并非能抽象出统一的接口类,即使能抽象出来也是不符合面向对象的。这时候就可能需要编写不同的代理类。而使用Java API提供的反射机制:正是这种反射机制的使用使得我们调用核心功能更加灵活,而不用依赖于某一个具体的接口,而是依赖于Object对象。
ps:IAction和AddAction的编写与3种一致,不再重复
public class ProxyAction implements InvocationHandler {
 	private Object action;
 	public ProxyAction(Object action) {
 		this.action = action;
 	}
 	/*
 	 * 得到代理类的实例
 	 */
 	public static Object getInstance(Object action) {
 		return Proxy.newProxyInstance(action.getClass().getClassLoader(),
 				action.getClass().getInterfaces(), new ProxyAction(action));
 	}
 	@Override
 	public Object invoke(Object proxy, Method method, Object[] args)
 			throws Throwable {
 		Object result=null;
 		try {
 			// 在委派之前作动作,如权限判断等
 			System.out.println("before method " + method.getName());
 			//验证是否被激活
 			if (((User) args[0]).isActive()) {
 				// 进行委派
 				result = method.invoke(action, args);
 			}
 		} catch (InvocationTargetException e) {
 			throw e.getTargetException();
 		} catch (Exception e) {
 			throw new RuntimeException("unexpected invocation exception: "
 					+ e.getMessage());
 		} finally {
 			// 在委派之后做动作
 			System.out.println("after method " + method.getName());
 		}
 		return result;
 	}
 }
5.动态代理的优化:
	模板方法模式来对这个代理类进行优化 :BaseProxy类
ps:IAction和AddAction的编写与3种一致,不再重复
public abstract class BaseProxy implements InvocationHandler {
 	private Object obj;
 	protected BaseProxy(Object obj) {
 		this.obj = obj;
 	}
 	public static Object getInstance(Object obj, InvocationHandler instance) {
 		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
 				.getClass().getInterfaces(), instance);
 	}
 	@Override
 	public Object invoke(Object proxy, Method m, Object[] args)
 			throws Throwable {
 		Object result=null;
 		try {
 			this.doBegin();// 代理执行前操作
 			System.out.println("before method " + m.getName());
 			//验证是否被激活
 			if (((User) args[0]).isActive()) {
 				// 进行委派
 				result = m.invoke(obj, args);
 			}
 		} catch (InvocationTargetException e) {
 			throw e.getTargetException();
 		} catch (Exception e) {
 			throw new RuntimeException("unexpected invocation exception: "
 					+ e.getMessage());
 		} finally {
 			System.out.println("after method " + m.getName());
 			this.doAfter();// 代理执行后操作
 		}
 		return result;
 	}
 	public abstract void doBegin();
 	public abstract void doAfter();
 }
public class ProxyImpl extends BaseProxy {
 	protected ProxyImpl(Object obj) {
 		super(obj);
 	}
 	public static Object getInstance(Object foo) {
 		return getInstance(foo, new ProxyImpl(foo));
 	}
 	@Override
 	public void doBegin() {
 		System.out.println("do the job before..");
 		
 	}
 	@Override
 	public void doAfter() {
 		System.out.println("do the job after..");
 	}
 	@Override
 	public Object invoke(Object proxy, Method m, Object[] args)
 			throws Throwable {
 		return super.invoke(proxy, m, args);
 	}
 }
总结:
1.何时代理?
2.代理本身并没有实际操作
分享到:
评论

相关推荐

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    java 面试题 总结

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    Java典型模块

    29.6.2 代理设计模式 29.7 小结 第30章 中国象棋游戏(GUI+游戏规则算法) 30.1 象棋游戏原理 30.1.1 象棋游戏的基本规则 30.1.2 项目结构框架分析 30.1.3 项目功能业务分析 30.2 象棋游戏项目——象棋游戏的主类 ...

    超级有影响力霸气的Java面试题大全文档

    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。 Hashtable和HashMap采用的hash/rehash算法都大概...

    java面试题

    答:单例模式是一种比较常见的设计模式,带给我们以下好处: 1:控制资源的使用 2:控制实例的产生数量 3:让多个不相关的两个线程或进程之间实现通信 为什么要用spring? 答:1、主要将各个框架有效的联系起来...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    网站设计方案(完整版).doc

    从数据安全角度考虑,考虑动态数据与网站数据库分开存储,同时把动态数据展现界 面也单独部署,与对外网站建立链接,形成主站与子站的关系,可以利用公司现有网络 安全控制机制很好地保护动态数据的安全性。...

    springCloud

    设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。 和组织间的网络通信。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作。 现有的消息代理开源产品: ActiveMQ ...

    新版Android开发教程.rar

    Google 自身通过基于统一平台为用户提供信息来盈利。 Android Android Android Android 的优势 � 源代码完全开放,便于开发人员更清楚的把握实现细节,便于提高开发人员的技术水平,有利于开发 出 更具差异性的应用...

    spring security 参考手册中文版

    31 Java认证和授权服务(JAAS)提供者 235 31.1概述 235 31.2摘要:Java认证提供者 235 31.2.1 JAAS CallbackHandler 235 31.2.2 JAAS权威机构 236 31.3 DefaultJaasAuthenticationProvider 237 31.3.1 ...

    TCP/IP技术大全(中文PDF非扫描版)

    2.6.9 Internet服务提供商 18 2.7 小结 19 第3章 TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 ...

    TCP-IP技术大全

    2.6.9 Internet服务提供商 18 2.7 小结 19 第3章 TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 ...

    TCP/IP教程TCP/IP基础

    2.6.9 Internet服务提供商 18 2.7 小结 19 第3章 TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 ...

    TCP/IP技术大全

    2.6.9 Internet服务提供商 18 2.7 小结 19 第3章 TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 ...

    TCP/IP详解

    2.6.9 Internet服务提供商 18 2.7 小结 19 第3章 TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 ...

Global site tag (gtag.js) - Google Analytics