前言:
适配器模式(Adapter Pattern)将一个类的接口转化为客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
一.适配器模式简介
适配器模式(Adapter Pattern)主要应用于希望复用一些现存的类,但是接口与复用环境要求不一致的情况。
相关实例:这就类似电源适配器解决了在不同的国家电压不同的情况下,比如有些国家220V,有些国家110V的情况下,都能使用同一种电器。适配器解决了当需要的东西在面前,却不能直接使用,而短时间又无法改造它,于是我们就想办法适配它。
何时用适配器模式呢?
- 当系统的数据和行为正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。
- 适配器不是在双方一有不同就要使用它,而是在双方都不太容易修改的时候,就该考虑适配了。比如公司开发一个第三方组件,而这个组件接口与自己的系统接口是不同的,这时候没有必要为了迎合对方的接口而修改自己公司的接口,所以在设计阶段,就该考虑用适配器模式解决问题了
二.适配器模式的实例讲解
案例:传统的手机音乐播放器集成喜马拉雅网络电台,实现既可以点歌还可以听电台。
案例分析:因为手机的音乐播放器在播放音乐方面已经很成熟了,随着网络电台的流行,手机音乐在原有的基础上接入第三方FM接口,这时,不管是手机APP还是第三方电台都不能再重新改动了,这时候就考虑由第三方电台提供FM接口,音乐播放器进行适配,实现播放电台的功能。
1.产品设计UML类图
(图片加载慢,多刷新几下,耐心等待……)
2.播放器接口类
设计分析:定义一个接口,封装播放音乐和停止播放音乐的行为。
package com.pattern.adapter.service;
public interface IPlayer {
// 播放音乐
public void playMusic(String musicName);
// 停止播放音乐
public void stopPlayMusic();
}
3.播放器的实现类
设计分析: 音乐播放器和FM播放器都约定好实现统一的播放相关的行为标准,然后各自分别实现。
①音乐播放器类
ppackage com.pattern.adapter.player;
import com.pattern.adapter.service.IPlayer;
public class MusicPlayer implements IPlayer {
@Override
public void playMusic(String musicName) {
System.out.println("播放音乐:《" + musicName + "》");
}
@Override
public void stopPlayMusic() {
System.out.println("停止播放音乐");
}
}
②电台播放器类
package com.pattern.adapter.player;
import com.pattern.adapter.service.IPlayer;
public class FMPlayer implements IPlayer {
@Override
public void playMusic(String musicName) {
System.out.println("播放电台:《" + musicName + "》");
}
@Override
public void stopPlayMusic() {
System.out.println("停止播放电台");
}
}
4.FM适配器类:
设计分析: 维护一个FMPlayer
对象的实例,用于适配音乐播放器的播放相关功能。
package com.pattern.adapter.player;
import com.pattern.adapter.service.IPlayer;
/**
* 播放适配器,实现对FM播放的兼容
*/
public class FMPlayerAdapter implements IPlayer {
// 实例化FM播放器类,添加对它的依赖
FMPlayer fmPlayer = new FMPlayer();
@Override
public void playMusic(String musicName) {
fmPlayer.playMusic(musicName);
}
@Override
public void stopPlayMusic() {
fmPlayer.stopPlayMusic();
}
}
5.客户端中使用
package com.pattern.adapter.client;
import com.pattern.adapter.player.FMPlayerAdapter;
import com.pattern.adapter.player.MusicPlayer;
public class Client {
public static void main(String[] args) {
// 播放音乐
MusicPlayer mPlayer = new MusicPlayer();
mPlayer.playMusic("给我一首歌的时间");
// 不想听歌了,停止播放音乐
mPlayer.stopPlayMusic();
// 播放器新增了播放电台的功能,听会电台吧
FMPlayerAdapter fmAdapter = new FMPlayerAdapter();
fmAdapter.playMusic("鬼吹灯");
// 停止播放电台
fmAdapter.stopPlayMusic();
}
}
6.运行结果展示
播放音乐:《给我一首歌的时间》
停止播放音乐
播放电台:《鬼吹灯》
停止播放电台
7.源码下载
本文示例代码下载地址:点击下载
三.总结:
1.适配器模式的优点
- 可以让两个无关的类一起运行
- 让代码复用性得到提高
- 可以灵活的使用
2.适配器模式的缺点
- 由于Java是单继承,所以只能适配一个类
- 过度使用适配器,会让程序变得非常凌乱,如无必要,直接对代码重构即可。