适配器模式(Adapter)
(参考Design Pattern GoF和设计模式之禅)
一:目标(用途)
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
二:使用情况
有两个相互独立的类A和类B, 客户端原本使用类A,现在因为某些原因需要使用类B的接口。为了不破坏原来就能正常工作的系统,打算不修改或者尽量少的修改客户端,也不修改类A和类B,而是添加一个适配器将类B的接口包装成或者伪装成类A的接口。这样对于原来的系统来说调用适配器还是和原来调用类A接口一样,但是适配器工作时真正调用的是类B的接口。
结构图:
从结构图可以看到,Adapter同时实现了Target和Adaptee的接口,Client 调用Target 的 Request接口, Target调用Adapter的Request接口,而Adapter最终真正工作的是Adaptee的SpecificRequest接口。Client和Target两个角色的组合原本就是一个正常的完整系统,为了要调用Adaptee的接口而添加Adapter角色。
三:角色
- Client 客户端
- Target 定义了客户端要使用的接口
- Adaptee 定义一个要被适配的接口
- Adapter 适配Adaptee和Target
适配器模式最主要的角色当然是Adapter,这里借用《设计模式之禅》的图例说明什么是适配器,为什么需要适配器。
物体A和物体B的接口不一致, 物体C有两个接口分别和A和B对接上,加入一个物体C后三个物体都可以完美地对接在一起。
四:适配器模式和装饰模式的区别
适配器模式和装饰模式都是Wrapper模式, 区别在于装饰模式是用于扩展一个接口的功能而适配器模式是用于兼容两个接口。