一、定义与特点
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。文章源自新逸网络-https://www.xinac.net/8880.html
- 适配器模式适用于以下场景
1、以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
2、使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。
3、有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
二、实现方式
(1)创建接口
创建一个播放器的接口,定义play方法文章源自新逸网络-https://www.xinac.net/8880.html
public interface MediaPlayer {
void play(String fileName);
}
(2)创建适配接口
创建一个高级播放器的接口,用于增强播放器的功能文章源自新逸网络-https://www.xinac.net/8880.html
public interface AdvancedMediaPlayer {
void playMp4(String fileName);
void playAvi(String fileName);
}
(3)实现适配接口
实现增强型播放器的扩展方法文章源自新逸网络-https://www.xinac.net/8880.html
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
System.out.println("play mp4.");
}
@Override
public void playAvi(String fileName) {
}
}
实现增强型播放器的扩展方法文章源自新逸网络-https://www.xinac.net/8880.html
public class AviPlayer implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
}
@Override
public void playAvi(String fileName) {
System.out.println("play avi.");
}
}
(4)适配器的具体实现
整合播放器的扩展功能,增强原始播放器功能文章源自新逸网络-https://www.xinac.net/8880.html
public class MediaAdapter implements MediaPlayer {
private AdvancedMediaPlayer advancedMediaPlayer;
@Override
public void play(String fileName) {
fileName = fileName.toLowerCase();
if (fileName.endsWith(".mp4")) {
advancedMediaPlayer = new Mp4Player();
advancedMediaPlayer.playMp4(fileName);
} else if (fileName.endsWith(".avi")) {
advancedMediaPlayer = new AviPlayer();
advancedMediaPlayer.playAvi(fileName);
}
}
}
(5)适配器的应用
播放器及扩展功能的应用,增强了原始播放器的功能文章源自新逸网络-https://www.xinac.net/8880.html
public class Player implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String fileName) {
fileName = fileName.toLowerCase();
if (fileName.endsWith(".mp3")) {
System.out.println("play mp3.");
} else if (fileName.endsWith(".mp4") || fileName.endsWith(".avi")) {
mediaAdapter = new MediaAdapter();
mediaAdapter.play(fileName);
} else {
System.out.println("file format not support.");
}
}
}
(6)测试实现
测试播放器的实现效果,播放器原始功能得到增强文章源自新逸网络-https://www.xinac.net/8880.html
public class Test {
public static void main(String[] args) {
Player player = new Player();
player.play("music.mp3");
player.play("music.mp4");
player.play("music.avi");
player.play("music.wmv");
}
}
测试输出内容文章源自新逸网络-https://www.xinac.net/8880.html
play mp3.
play mp4.
play avi.
file format not support.
三、相关内容
- 注意事项
1、适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
2、需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。 - 优缺点
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
5、对类适配器来说,更换适配器的实现过程比较复杂。 - 模式结构
1、目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
2、适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
3、适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。 - 参考文章
1、http://c.biancheng.net/view/1361.html
2、https://www.runoob.com/design-pattern/adapter-pattern.html
文章源自新逸网络-https://www.xinac.net/8880.html 文章源自新逸网络-https://www.xinac.net/8880.html
评论