代理模式——动态代理和模板方法那点事
2013-04-24 17:18
155 查看
上篇我们将了一下代理模式的静态代理,然后碰到一个代码重复的问题。
回头在来看下我们用代理实现事务的封装,它们都遵循这样的一个结构:
PS:比较可惜的是,我看源码没有搞明白代理这块的具体实现,只是按照个人对设计模式的一种理解来分析一下而已。
这些结构不只是上面的形式,还有方法名、参数、返回值,每个类都有实现的接口。
个人对动态代理的理解就是用了一个模板方法来进行的实现,提取一个公共的InvocationHandler接口,这个接口中有一个invoke方法,方法的参数分别是Proxy,Method,args。通过Method可以获取到要执行的方法,也就是把需要变更的东西都进行了抽取。
这样,就实现了变更的抽取,那么只需要通过method.invoke()方法,就可以调取需要调用的方法。而公共部分的操作,就只需要些一份就足够了。
下面是代码实现,接口和BLL实现类,沿用上篇提到的使用代理后的BLLImpl:
关于模板方法的另一个应用——封装算法步骤,Servlet就是一个很好的例子,有兴趣可以自己看一下究竟怎样封装算法就是用到了模板方法模式。
知道设计模式是一回事,可以应用又是一回事,能够在设计的时候想到设计模式是一件任重而道远的事情。
一款好的软件,一个大的架构,必定是N多个设计模式的结合,三层架构如此,MVC架构也如此。本人关于MVC和三层架构曾经写过一篇博文进行对比,学这块的时候又回头看了一下,就现在而言,当时的理解还是没有太大问题的,博文名称是:详谈架构。
回头在来看下我们用代理实现事务的封装,它们都遵循这样的一个结构:
System.out.println("------获取连接------"); System.out.println("------开户事务------"); 方法调用 System.out.println("------提交事务------"); System.out.println("------关闭连接------");下面我们就再来回想一个叫做模板方法的设计模式吧。这个设计模式有两种用途:封装算法步骤和提取公共部分。现在我们要用的是这个设计模式的提取公共部分。
PS:比较可惜的是,我看源码没有搞明白代理这块的具体实现,只是按照个人对设计模式的一种理解来分析一下而已。
这些结构不只是上面的形式,还有方法名、参数、返回值,每个类都有实现的接口。
个人对动态代理的理解就是用了一个模板方法来进行的实现,提取一个公共的InvocationHandler接口,这个接口中有一个invoke方法,方法的参数分别是Proxy,Method,args。通过Method可以获取到要执行的方法,也就是把需要变更的东西都进行了抽取。
这样,就实现了变更的抽取,那么只需要通过method.invoke()方法,就可以调取需要调用的方法。而公共部分的操作,就只需要些一份就足够了。
下面是代码实现,接口和BLL实现类,沿用上篇提到的使用代理后的BLLImpl:
public class TransactionHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObject){ this.targetObject=targetObject; return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object ret=null; System.out.println("------获取连接------"); System.out.println("------开户事务------"); ret=method.invoke(targetObject, args); System.out.println("------提交事务------"); System.out.println("------关闭连接------"); return ret; } }现在,关于事务的代码,只需要维护一份就足够了。
关于模板方法的另一个应用——封装算法步骤,Servlet就是一个很好的例子,有兴趣可以自己看一下究竟怎样封装算法就是用到了模板方法模式。
知道设计模式是一回事,可以应用又是一回事,能够在设计的时候想到设计模式是一件任重而道远的事情。
一款好的软件,一个大的架构,必定是N多个设计模式的结合,三层架构如此,MVC架构也如此。本人关于MVC和三层架构曾经写过一篇博文进行对比,学这块的时候又回头看了一下,就现在而言,当时的理解还是没有太大问题的,博文名称是:详谈架构。
相关文章推荐
- 关于动态代理---模板方法模式,工厂模式,依赖倒转
- Java基础 - 类的加载,类加载器,反射,动态代理,模板设计模式,JDK5新特性,枚举(类),JDK1.7新特性
- 代理模式之Java动态代理实现方法
- 命令模式-适配器模式-外观模式-模板方法模式-迭代器模式-组合模式-状态模式-代理模式
- 大话设计模式之五:6~10章(装饰模式 、代理模式、工厂方法模式、原型模式、模板方法模式)
- 简介Python设计模式中的代理模式与模板方法模式编程
- 简介Python设计模式中的代理模式与模板方法模式编程
- 增强 修改对象的集中方法(继承、装饰者模式、动态代理)
- 大话设计模式(二)代理模式 工厂方法模式 原型模式 模板方法模式 迪米特法模式 外观模式
- java设计模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,。 行为型模式,共十一种:策略模式、模板方法)
- java 动态代理(模式) InvocationHandler(为类中方法执行前或后添加内容)
- 方法调用黑马程序员_代理模式之动态代理
- 《设计模式之禅》学习小节之模板方法模式,建造者模式和代理模式
- 利用动态代理模式来增强方法
- 【设计模式】【动态代理,在方法前和方法后加事务,AOP】
- 代理模式,简单(静态)工厂模式,单例模式,模板方法模式个人理解
- 代理方法动态代理模式封装事务详解
- 动态代理模式+tostring方法
- Android设计模式之动态代理,实现方法拦截功能
- 【设计模式】动态代理,附使用方法