适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
参考: 菜鸟教程-适配器模式
前提
为了解决类中方法更新而使用不了之前方法的问题
1. 类适配器模式
代码展示:
public interface Look {
void GIFShow();
void PNGShow();
}
public class PhotoAdapter extends PhotoShow implements Look{
@Override
public void GIFShow() {
System.out.println("查看GIF图片");
}
}
public class PhotoShow{
public void JPGShow() {
System.out.println("查看JPG图片格式");
}
public void PNGShow() {
System.out.println("查看PNG图片格式");
}
}
//在测试的时候可以发现不管是新方法还是之前的老办法都可以调用
public class ClassAdapterTest {
public static void main(String[] args) {
PhotoAdapter photoAdapter = new PhotoAdapter();
photoAdapter.GIFShow();
photoAdapter.JPGShow();
photoAdapter.PNGShow();
}
}
2. 对象适配器模式
public interface Look {
void GIFShow();
void PNGShow();
}
public class PhotoAdapter implements Look {
private PhotoShow photoShow;
public PhotoAdapter() {
}
public PhotoAdapter(PhotoShow photoShow) {
this.photoShow = photoShow;
}
public void JPGShow(){
photoShow.JPGShow();
}
@Override
public void GIFShow() {
System.out.println("查看GIF图片");
}
@Override
public void PNGShow() {
photoShow.PNGShow();
}
}
public class PhotoAdapter implements Look {
private PhotoShow photoShow;
public PhotoAdapter() {
}
public PhotoAdapter(PhotoShow photoShow) {
this.photoShow = photoShow;
}
public void JPGShow(){
photoShow.JPGShow();
}
@Override
public void GIFShow() {
System.out.println("查看GIF图片");
}
@Override
public void PNGShow() {
photoShow.PNGShow();
}
}
public class ClassAdapterTest {
public static void main(String[] args) {
PhotoAdapter photoAdapter = new PhotoAdapter(new PhotoShow());
photoAdapter.GIFShow();
photoAdapter.JPGShow();
photoAdapter.PNGShow();
}
}
3. 完整版本
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
代码实现:
AdvancedMediaPlayer.java
// 支持媒体文件的播放接口
public interface AdvancedMediaPlayer {
void playVlc();
void playMp4();
}
Mp4Player.java
// 对于mp4格式文件的实现
public class Mp4Player implements AdvancedMediaPlayer{
@Override
public void playVlc() {
}
@Override
public void playMp4() {
System.out.println("播放Mp4文件媒体");
}
}
VlcPlayer .java
// 对于vlc格式文件的实现
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc() {
System.out.println("播放vlc格式的媒体");
}
@Override
public void playMp4() {
}
}
MediaPlayer .java
// 支持音频格式的播放接口
public interface MediaPlayer {
void play(String audioType);
}
MediaAdapter .java
// 采用了对象适配器的思想
public class MediaAdapter implements MediaPlayer{
// 运用了对象适配器模式
private AdvancedMediaPlayer advancedMediaPlayer;
// 通过用户的要求动态调用指定接口的实现类中的功能
public MediaAdapter(String audioType){
if (audioType.equalsIgnoreCase("mp4")){
advancedMediaPlayer = new Mp4Player();
} else if (audioType.equalsIgnoreCase("vlc")){
advancedMediaPlayer = new VlcPlayer();
} else {
advancedMediaPlayer = null;
}
}
@Override
// 通过对象适配器模式拓展此接口的功能
public void play(String audioType) {
if (audioType.equalsIgnoreCase("mp4")){
advancedMediaPlayer.playMp4();
} else if (audioType.equalsIgnoreCase("vlc")){
advancedMediaPlayer.playVlc();
} else {
System.out.println("暂不支持此格式");
}
}
}
AudioPlayer .java
// 拓展之后的播放器
public class AudioPlayer implements MediaPlayer{
private MediaAdapter mediaAdapter;
@Override
// 通过适配器属性将原有功能进行拓展
public void play(String audioType) {
if (audioType.equalsIgnoreCase("mp3")){
System.out.println("播放mp3格式的音频");
} else if (audioType.equalsIgnoreCase("mp4") || audioType.equalsIgnoreCase("vlc")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType);
}
}
}
DemoTest .java
// 测试
public class DemoTest {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3");
audioPlayer.play("mp4");
audioPlayer.play("vlc");
}
}