适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
创建一个播放器的接口,定义play方法
public interface MediaPlayer {
void play(String fileName);
}
创建一个高级播放器的接口,用于增强播放器的功能
public interface AdvancedMediaPlayer {
void playMp4(String fileName);
void playAvi(String fileName);
}
实现增强型播放器的扩展方法
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
System.out.println("play mp4.");
}
@Override
public void playAvi(String fileName) {
}
}
实现增强型播放器的扩展方法
public class AviPlayer implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
}
@Override
public void playAvi(String fileName) {
System.out.println("play avi.");
}
}
整合播放器的扩展功能,增强原始播放器功能
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);
}
}
}
播放器及扩展功能的应用,增强了原始播放器的功能
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.");
}
}
}
测试播放器的实现效果,播放器原始功能得到增强
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");
}
}
测试输出内容
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
本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-adapter.html
最后更新:2020-08-19 14:58:25
Update your browser to view this website correctly. Update my browser now