设计模式--学习笔记--适配器模式Adapter--基础篇

来源:互联网 发布:java nio io面试题 编辑:程序博客网 时间:2024/06/08 00:06

    Adapter模式,即适配器模式,是一种常见的模式,本文将包含如下部分

  • Adapter模式是什么、如何实现
  • Adapter的示例Demo
  • Adapter在Java中的体现
  • 参考资料

一、Adapter模式是什么、如何实现

  1. Adapter模式是什么

    《设计模式解析》中的解释为:将一个类的接口转换为客户希望的另一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。

    在实际的开发中,我们可能会重复的使用某些模块,那么会有类似的场景:
    i.   你希望使用其他人编写的子程序或方法,因为你需要它执行的功能;
    ii.  你无法将这个子程序直接加入程序中;
    iii. 子程序的接口或调用的方式与需要使用他的相关对象不完全相同

    那么,此时的你可能需要使用Adapter模式了,下面阐述下Adapter如何实现,并会以示例加以说明。

  2. Adapter模式的示例Demo

      
    如左图,客户端希望调用图形进行绘制,抽象出图形的基类Shape,并实现子类(点、线、面);此时,如果我们希望对程序进行拓展,添加圆形,那么常规的方式,就是继承Shape实现子类Circle;但此时如果已经有一个实现好了的Circle类,但实现的方法与名称与现有的设定不符,如右图所示,
    那么我们的解决办法将是:适配他,如下图:


    在这里,我们创建子类Circle,Circle持有ShapeCircle对象,这样,发送给Circle的任何调用,都将由ShapeCIrcle来负责处理,下面看下Java代码片断:
    class Circle extends Shape{     private ShapeCircle shapeCircle;          public Circle()     {         shapeCircle = new ShapeCircle();     }           public void DrawSelf()     {         shapeCircle.DisplayCircle();     }}

  3. Adapter模式的实现
    适配器模式主要用于解决:系统的数据与行为都正确,但接口不符合。通常用于必须从抽象类派生时
    那么具体的实现规则则是:将原有类包含在另一个类之中。让包含类与需要的接口匹配,调用被包容类的方法。

二、Adapter模式在Java中的体现
    在Java I/O中,InputStreamReader便体现了Adapter模式,下面看下InputStreamReader的关系图
   

    InputStreamReader提供了一种字节流到字符流的转换,如上所示,InputStreamReader继承了Reader,同时持有StreamDecoder对象(组合关系has-a),StreamDecoder持有InputStream对象(组合关系has-a)。

    根据InputStreamReader的功能来看,字节流到字符流的转化,那么StreamDecoder则是一个Adapter,提供了这种转化操作(事实上StreamDecoder做了两件事:第一、完成字节流与字符流的适配;第二、完成对字符流的编码)。

    下面解释下上述各类的作用,并辅以代码

     InputStreamReader:

    

     InputStreamReader 持有StreamDecoder对象,同时Read方法,调用的是StreamDecoder对象中的Read方法
    

     Read(有参数与无参数)

    

    
     可以看出,那么猜想一下,当通过字节流读入时,StreamDecoder将进行适配,将byte[]转化为char[]
     查看StreamDecoder源码:
    

     StreamDecoder中的read方法:
    
      
三、小结

       至此,关于Adapter的介绍也就完成了,但在软件设计上如何合理的运用以及如何与其他模式的组合使用,并没有更多的探讨,如果有好的建议可以留言给我。

四、参考资料

        《设计模式解析》(第二版)

        《大话设计模式》

        《深入分析Java Web——技术内幕》
          Java jdk1.7源码

 

原创粉丝点击