zoukankan      html  css  js  c++  java
  • 【设计模式】继承适配模式

    问题:

      曾经遇到一个设计模式的问题:spring里面的HandlerInterceptor有个实现类是HandlerInterceptorAdaptor,这个类的名字是以adaptor结尾的,但是实际就是HandlerInterceptor接口做了几个基本的实现,为什么不叫做AbstractHandlerInterceptor?HandlerInterceptorAdaptor这个名字明显就是代表适配器模式,但是实际又不是,我发现spring好多这种带adapter结尾的

    分析:

      其实不仅仅是Spring,而且很多开源框架如Netty都有很多Adaptor结尾的类,通常我们可以发现的是,有Adaptor类的方法均是提供了所有默认的简单实现,而以Abstract开头的抽象类必然开放了abstract方法出去;

      那么这些Adapter类是做成抽象类,但是又提供了所有的实现,没有开放接口出去,但也不能实例化,那怎么用呢?所以使用者必然要继承它,而且要实现拦截又要重写你需要的方法,这就要求实现者对拦截器的上层结构是非常了解的,但很可能实现者并不想把它实现的类的职责赋予任何和“拦截器”这种侵入性的类型,可能实现者眼里做的只是一个权限验证类,并不想管框架的逻辑,但又要被框架所理解和调用,怎么解决这种矛盾呢?适配这种思想就来了,通过适配表面我适配了框架,但我又可以完全脱离框架,因为就算去除重写的方法,我的类命名含义也丝毫不受影响。

      所以这可以看的出,用Adapter结尾是设计者希望对接者对高层比较了解,而进行自行适配的一种模型,这可以使得继承类的方法命名非常符合自描述性,是一种整洁代码的机制;为什么是整洁代码呢?如果深入了解过《重构》和《代码整洁之道》的朋友估计就很清楚,一个类的命名是多么的重要;代码的艺术,是从有Sense开始的;

    结论:

      整洁代码的继承适配模式

  • 相关阅读:
    DropDownList控件的AutoPostBack属性的问题 选择后,值也跟着刷新 Kenny
    window showModalDialog 在IE6 IE7 高度(height) 问题 Kenny
    discuz初玩之一 未将对象引用设置到对象的实例(Discuz.Forum.HttpModule.ReUrl_BeginRequest) Kenny
    最长公共子串问题 LCS
    HDOJ 1024
    项目一周工作总结
    DartCloud技术难点、问题及经验教训
    中国云项目遇到的问题
    我的计算机书单
    翻转句子中单词的顺序 面试题
  • 原文地址:https://www.cnblogs.com/iCanhua/p/10941493.html
Copyright © 2011-2022 走看看