Java设计模式-适配器模式
什么是适配器模式
适配器模式是一种结构型设计模式,它的主要作用是使得原本不兼容的接口可以一起工作。适配器模式通过创建一个包装类,将一个类的接口转换成客户期望的另一个接口。
主要解决什么问题
适配器模式主要解决的是在软件系统中,经常会遇到现有的类无法直接满足新的需求,需要使用一个已经存在的接口,但是这个接口又与现有的代码不兼容的问题。
在什么时候我们需要使用适配器模式
当我们需要使用一个已经存在的类,而它的接口不符合我们的需求,或者我们希望创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类(即那些接口可能不一定兼容的类)协同工作时,我们可以使用适配器模式。
生活中的应用实例
生活中的一个常见例子就是电源适配器。比如,你的手机可能使用USB-C接口进行充电,但是你的电源插座可能只有标准的美式或欧式插孔。在这种情况下,你需要一个电源适配器,将电源插座的接口转换为USB-C接口,使得你的手机可以进行充电。
优点
可以让任何两个没有关联的类一起运行。
提高了类的复用性。
增加了类的透明度。
缺点
过多地使用适配器,会使系统非常零乱,不易整体进行把握。
由于Java至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
使用场景
系统需要使用现有的类,而这些类的接口不符合系统的需求。
想要建立一个可复用的类,用于与一些彼此之间没有太大关联的一些类,包括一些未来可能存在的类一起工作。
代码示例
假设我们有一个 MediaPlayer 接口,但是我们有一个 VlcPlayer 类只实现了 AdvancedMediaPlayer 接口。我们可以创建一个适配器 MediaAdapter 来使得 VlcPlayer 可以被 MediaPlayer 接口使用。
interface MediaPlayer {
void play(String audioType, String fileName);
}
interface AdvancedMediaPlayer {
void playVlc(String fileName);
}
class VlcPlayer implements AdvancedMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file. Name: " + fileName);
}
}
class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer = new VlcPlayer();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("vlc")) {
advancedMediaPlayer.playVlc(fileName);
}
}
}
class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("vlc")) {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
} else {
System.out.println("Invalid media. " + audioType + " format not supported");
}
}
}
在这个例子中,AudioPlayer 使用 MediaAdapter 适配 VlcPlayer,使得 AudioPlayer 可以播放VLC格式的文件,而无需修改 VlcPlayer 类。