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源码