您的位置:首页 > 其它

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

2013-09-14 23:44 651 查看
Adapter模式,即适配器模式,是一种常见的模式,本文将包含如下部分

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

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

Adapter模式是什么

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

在实际的开发中,我们可能会重复的使用某些模块,那么会有类似的场景:

i. 你希望使用其他人编写的子程序或方法,因为你需要它执行的功能;

ii. 你无法将这个子程序直接加入程序中;

iii. 子程序的接口或调用的方式与需要使用他的相关对象不完全相同

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

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();
     }
}


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源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: