1 导读
一般客户端通过目标类的接口访问它所提供的服务。
有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。
这时,现有接口需要转化为客户端的期望接口,保证复用现有类。若不进行这样转化,客户端就不能利用现有类所提供功能,适配器模式就可以完成这样的转化。
在适配器模式中可以定义一个包装类,包装不兼容接口的对象
- 包装类
适配器(Adapter) - 所包装的对象
适配者(Adaptee),即被适配的类
适配器提供客户类需要的接口。
适配器的实现就是把客户端的请求转化为对适配者的相应接口的调用。即当客户类调用适配器方法时,在适配器类的内部将调用适配者类的方法,而该过程对客户类透明,客户类并不直接访问适配者类。
因此,适配器可以使由于接口不兼容而不能交互的类可以一起协作。
2 定义
将一个接口转换成客户端希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。
既可以作为类结构型模式,也可以作为对象结构型模式。
3 结构
- Target:目标抽象类
- Adapter:适配器类
- Adaptee:适配者类
- Client:客户类
适配器模式有对象适配器和类适配器两种实现:
3.1 对象适配器
3.2 类适配器
4 时序图
5 代码分析
实现
- MediaPlayer 接口
- 实现 MediaPlayer 接口的实体类 AudioPlayer
默认情况下,AudioPlayer 可以播放 mp3
- 接口 AdvancedMediaPlayer
- 实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。
我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建
- 一个实现了 MediaPlayer 接口的适配器类 MediaAdapter
使用
- AdvancedMediaPlayer 对象来播放所需的格式。
AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo,我们的演示类使用 AudioPlayer 类来播放各种格式。