`
hl756799782
  • 浏览: 77798 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

GoF著作中未提到的设计模式(3):Interceptor (转载)

阅读更多

原文链接:http://www.cnblogs.com/west-link/archive/2011/06/22/2086591.html

 

拦截器模式为我们提供了一种拦截方法调用或消息的途径,整个过程是自动的、透明的,下面是一个简单的拦截器示意图:

 

  从图中可以看到,拦截器可以访问到方法调用的输入参数和返回结果,这样的话,拦截器能做的事儿就多啦,比如:
  1、验证输入参数是否正确
  2、偷偷地修改参数的值,例如参数类型的自动转换等
  3、依赖注入
  4、修改返回结果的内容、格式等

  下面是一个包含我们要拦截的方法的类:

public class Action{ // 拦截器集合的迭代器 private Iterator interceptors; // 输入参数 private Parameter param; // 返回结果 private Result result; // 构造函数 public Action(Parameter param); // 这个方法是我们要拦截的(具体实现见下面) public Result invoke(); // 其他... }

下面声明一个拦截器接口:

public interface Interceptor{ public Result intercept(Action action); }

我们可能会想到以下的拦截方式:

// 先在方法调用之前拦截一下,可以处理输入参数 intercept(param); // 调用方法 result = action.invoke(param); // 在方法调用之后再拦截一下,可以处理返回结果 intercept(result);

这种方式的缺点是不能完全地控制方法的调用,比如不能跳过方法的调用而直接返回结果、不能更改所在对象内部的状态等。

下面的实现也能达到方法调用的前后拦截,并且有完全控制该对象的能力

public Result invoke(){ if( interceptors.hasNext() ){ Interceptor interceptor = interceptors.next(); result = interceptor.intercept(this); } }

下面我们举几个拦截的具体例子:

// 参数合法性验证拦截器 public ParamInvalidator implements Interceptor{ public Result intercept(Action action){ Paramemter param = action.getParam(); // 确保参数不为null if(param == null){ addMessege("param is null!"); // 创建一个默认的参数对象 action.setParam(new Paramemter()); } // 继续调用过程 return action.invoke(); } }

一般来说,这类拦截器应该放在拦截器集合的最前面,所以,拦截器的被执行顺序是比较重要的!这依赖于具体的实现需求。

如果需求有要求:参数为null时直接返回一个null的结果,停止调用过程,那么我们可以把上面的方法改成这样:

public Result intercept(Action action){ Paramemter param = action.getParam(); if(param == null){ return null; } // 继续调用过程 return action.invoke(); }

所以,在所有的拦截器的实现中,action.invoke()这一行代码的位置或者有无非常重要,通过控制它我们就能在调用的前后进行拦截,甚至不调用它!

public interface MoneyAware{ public void setMoney(int money); } // 依赖注入拦截器 public DependencyInjector implements Interceptor{ public Result intercept(Action action){ // 如果它实现了MoneyAware接口,那么我们就给它注入5毛钱 if(action instanceof MoneyAware){ action.setMoney(5); } // 继续调用过程 return action.invoke(); } }

从这个拦截器可以看出,我们能修改被拦截对象的内部状态。

// 结果格式化拦截器 public ResultFormater implements Interceptor{ public Result intercept(Action action){ // 先调用要拦截的方法 result = action.invoke(); // 将结果格式化 formatResult(result); // 返回结果 return result; } }

这个拦截器就是方法调用后的拦截,所以这种拦截器被执行的时候被放在调用堆栈的最下面,当其他拦截器执行完后,它才被执行!

 

特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!

分享到:
评论

相关推荐

    GOF设计模式中英文+设计模式精解中英文

    GOF(Gang of Four)设计模式,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位专家在他们的著作《设计模式:可复用面向对象软件的基础》中提出,被誉为设计模式的经典之作。本资源包含了GOF设计...

    GoF的经典著作设计模式(Design Pattern)

    《设计模式:可复用面向对象软件的基础》是Gang of Four(GoF)四位作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著的一本经典书籍,它在软件工程领域具有深远影响。这本书系统地介绍了23种...

    GOF 设计模式 中文 高清

    《GOF设计模式》是软件工程领域的一部经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,因此常被称为“Gang of Four”(GOF)的设计模式。这本书详尽地阐述了23种设计模式,这些...

    GOF23种设计模式

    GOF(GoF)23种设计模式,是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大神在他们的著作《设计模式:可复用面向对象软件的基础》中提出的,这些模式分为创建型、结构型和行为型三大类。...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现 #### 0. 引言 设计模式作为面向对象编程的核心组成部分,是软件开发者在长期实践中总结出来的最佳实践。通过深入理解这些设计模式,我们可以更好地进行面向...

    Gof设计模式设计模式设计模式PDF

    《Gof设计模式设计模式设计模式PDF》是一个深入学习设计模式的重要资源,包含了全面而详尽的设计模式理论和实践知识。设计模式是软件工程中的一种最佳实践,它为解决常见问题提供了一种可复用的解决方案,使得代码...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出的。这本书详细阐述了23种设计...

    经典教程GOF设计模式(中文版)

    《经典教程GOF设计模式(中文版)》是学习软件设计模式的重要参考资料,它涵盖了GOF(Gamma, Helm, Johnson, Vlissides)四位大师提出的23种经典设计模式。设计模式是软件工程中经过实践验证的解决常见问题的最佳方案...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是软件工程领域的一个重要概念,它提供了一种解决常见问题的方法论。GoF(Gang of Four)所提出的23种设计模式被视为面向对象设计的...

    设计模式精解-GoF 23种设计模式精解JAVA版 PDF

    著名的EJB领域顶尖的专家Richard Monson-Haefel在其个人网站:www.EJBNow.com中极力推荐的GoF的《设计模式》,原文如下: Design Patterns Most developers claim to experience an epiphany reading this book....

    GoF的23个经典设计模式

    以文本和思维导图的方式简明扼要的介绍了GoF的23个经典设计模式,可当成学习设计模式的一个小手册,偶尔看一下,说不定会对大师的思想精髓有新的领悟。

    GOF的23个设计模式

    《GOF的23个设计模式》是一本经典的设计模式指南,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者(通常称为“Gang of Four”,简称GOF)编写。这本书是软件工程领域的重要里程碑,详细阐述了...

    GOF之23种设计模式的C#实现:DesignPattern.zip

    "GOF之23种设计模式"是由四名作者——Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides(通常称为Gang of Four,简称GOF)在他们的著作《设计模式:可复用面向对象软件的基础》中提出的。这些模式为创建可...

    中文版GOF设计模式

    《中文版GOF设计模式》是一本面向中文读者的、详细阐述GOF设计模式的经典著作。GOF,全称为 Gamma, Erich, Richard Helm, Ralph Johnson, and John Vlissides,这四位作者合著了《设计模式:可复用面向对象软件的...

    设计模式精解- GoF 23种设计模式解析附C++实现源码

    设计模式精解- GoF 23种设计模式解析附C++实现源码 懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要。反之好像也可能成立。道可道,非常道。道不远人,设计模式亦然如此。 一直想把自己的学习经验以及在...

    GOF设计模式双语版(设计模式经典之作)

    《GOF设计模式双语版》是一本设计模式领域的经典之作,它由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者共同撰写,因此在业界被广泛称为“Gang of Four”(GOF)的著作。这本书详尽地阐述了23...

    GOF的设计模式 中文清晰文字版

    《GOF的设计模式》是面向对象编程领域中的一本经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者合著,通常被简称为Gang of Four(GOF)设计模式。这本书详尽地阐述了23种经典的设计...

    GOF设计模式(中英文双语)

    GOF(Gang of Four)设计模式,又称为GoF设计模式,是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年出版的《设计模式:可复用面向对象软件的基础》一书中提出的。这本书被誉为设计...

    GOF 23个设计模式

    《GOF 23个设计模式》是一本深入探讨软件设计的经典著作,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师合著,他们被业界尊称为“Gang of Four”(GOF)。这本书详尽阐述了23种经典的设计...

Global site tag (gtag.js) - Google Analytics