适配器模式
适配器模式(adapter Pattern),又叫变压器模式。变压器是可以使高低电压相互转换。
1适配器模式的定义
适配的英文原文是:
Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
意思是:将一个类的接口编程客户端期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式就是将一个接口或类转换成其他的接口或类,适配器相当于一个包装器。
适配器设计以下三个角色:
- 目标(Target)角色:该角色定义要转换成的目标接口。
- 源(Adaptee)角色:需要被转换成目标角色的源角色。
- 适配器(Adapter)角色:该角色是适配器模式的核心,职责是通过继承的方式或是类关联的方式,将源角色转换为目标角色。
![](https://img2020.cnblogs.com/blog/1989411/202012/1989411-20201229084950803-1300246306.png)
适配器模式类图
创建目标角色
Target.java
package com.eric.结构型模式.适配器模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 目标角色
* @CreateTime 2020-11-30 12:51:20
*/
public interface Target {
//任务
public void task();
}
创建源角色
Adaptee.java
package com.eric.结构型模式.适配器模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 源角色
* @CreateTime 2020-11-30 12:52:09
*/
public class Adaptee {
//原有业务处理
public void SpecificTask(){
System.out.println("原始业务处理中...");
}
}
创建适配器
Adapter.java
package com.eric.结构型模式.适配器模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 适配器角色
* @CreateTime 2020-11-30 12:53:19
*/
public class Adapter extends Adaptee implements Target {
@Override
public void task() {
super.SpecificTask();
}
}
测试类
Client.java
package com.eric.结构型模式.适配器模式.引例;
/**
* @author Eric
* @ProjectName my_design_23
* @description 测试类
* @CreateTime 2020-11-30 12:54:24
*/
public class Client {
public static void main(String[] args) {
//适配器模式应用
Target target = new Adapter();
target.task();
}
}
测试结果
![](https://img2020.cnblogs.com/blog/1989411/202012/1989411-20201229084951156-1908129913.png)
说明适配器已经起到了作用。
2适配器模式的应用场景
a.适配器模式的优点
- 适配器模式可以让两个没有任何关系的类在一起运行。
- 增加了类的透明性
- 提高了类的复用度
- 增强代码的灵活性
b.适配器模式的使用场景
使用适配器模式的典型场景:修改一个已经投产中的系统时,需要对系统进行扩展,此时使用一个已有的类,但这个类不符合系统接口。这时可以使用适配器模式,将不符合系统接口的类进行转换,转换成符合系统的接口或可使用的类。
- 美国电器110V,中国220V,就需要一个适配器将110V转化为220V。
- Java JDK1.1 提供了Enumeration接口,而在1.2中提供了Iterator接口,想要使用1.2的JDK,则要将以前系统的Enumeration接口转化为Iterator接口,这时就需要适配器模式。
- 在Linux上运行Windows程序。
- Java中的jdbc
3.适配器模式的案例
例1:水饺转换成馄饨
创建混沌接口
Hundun.java
package com.eric.结构型模式.适配器模式.例1;
/**
* @author Eric
* @ProjectName my_design_23
* @description 馄饨接口
* @CreateTime 2020-11-30 16:17:31
*/
public interface Hundun {
public void makeHundun();
}
创建饺子类
Dumplings.java
package com.eric.结构型模式.适配器模式.例1;
/**
* @author Eric
* @ProjectName my_design_23
* @description 饺子类
* @CreateTime 2020-11-30 16:14:40
*/
public class Dumplings {
public void makeDumplings(){
System.out.println("调制菜馅");
System.out.println("擀面皮");
System.out.println("包饺子");
}
}
创建测试类
ClientDemo.java
package com.eric.结构型模式.适配器模式.例1;
/**
* @author Eric
* @ProjectName my_design_23
* @description 测试类
* @CreateTime 2020-11-30 17:18:28
*/
public class ClientDemo {
public static void main(String[] args) {
Hundun adapter = new FoodAdapter();
adapter.makeHundun();
}
}
测试结果
package com.eric.结构型模式.适配器模式.例2.video;
/**
* @author Eric
* @ProjectName my_design_23
* @description 牛皮的媒体播放器 播放视频
* @CreateTime 2020-11-30 17:28:19
*/
public interface AdvanceMediaPlayer {
public void playVlc(String fileName);
public void playMp4(String fileName);
}
MediaPlayer.java
package com.eric.结构型模式.适配器模式.例2.player;
/**
* @author Eric
* @ProjectName my_design_23
* @description 媒体接口 播放音乐使用
* @CreateTime 2020-11-30 17:27:22
*/
public interface MediaPlayer {
public void play(String audioType,String fileName);
}
创建AdvanceMediaPlayer的实现类
Mp4Player.java
package com.eric.结构型模式.适配器模式.例2.video;
/**
* @author Eric
* @ProjectName my_design_23
* @description Mp4的实现类
* @CreateTime 2020-11-30 17:31:21
*/
public class Mp4Player implements AdvanceMediaPlayer {
@Override
public void playVlc(String fileName) {
//没有此业务
}
@Override
public void playMp4(String fileName) {
System.out.println("播放Mp4文件(Name:"+fileName+")中....");
}
}
VlcPlayer.java
package com.eric.结构型模式.适配器模式.例2.video;
/**
* @author Eric
* @ProjectName my_design_23
* @description Vlc的实现类
* @CreateTime 2020-11-30 17:29:51
*/
public class VlcPlayer implements AdvanceMediaPlayer {
@Override
public void playVlc(String fileName) {
System.out.println("播放vlc文件(Name:"+fileName+")中....");
}
@Override
public void playMp4(String fileName) {
//没有此业务
}
}
创建MediaAdapter适配器,适配视频
MediaAdapter.java
package com.eric.结构型模式.适配器模式.例2.player;
import com.eric.结构型模式.适配器模式.例2.video.AdvanceMediaPlayer;
import com.eric.结构型模式.适配器模式.例2.video.Mp4Player;
import com.eric.结构型模式.适配器模式.例2.video.VlcPlayer;
/**
* @author Eric
* @ProjectName my_design_23
* @description 媒体适配器类
* @CreateTime 2020-11-30 17:33:35
*/
public class MediaAdapter implements MediaPlayer {
private AdvanceMediaPlayer advanceMediaPlayer;
public MediaAdapter(String audioType){
if("vlc".equalsIgnoreCase(audioType)){
advanceMediaPlayer = new VlcPlayer();
}else if("mp4".equalsIgnoreCase(audioType)){
advanceMediaPlayer = new Mp4Player();
}
}
@Override
public void play(String audioType, String fileName) {
if("vlc".equalsIgnoreCase(audioType)){
advanceMediaPlayer.playVlc(fileName);
}else if("mp4".equalsIgnoreCase(audioType)){
advanceMediaPlayer.playMp4(fileName);
}
}
}
创建AudioPlayer
AudioPlayer.java
package com.eric.结构型模式.适配器模式.例2.player;
/**
* @author Eric
* @ProjectName my_design_23
* @description 实现MediaPlayer接口的实现类
* @CreateTime 2020-11-30 17:39:27
*/
//可以播放不同类型的音频格式
public class AudioPlayer implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
//播放MP3音乐文件的内置支持
if("mp3".equalsIgnoreCase(audioType)){
System.out.println("播放 MP3-file(Name:"+fileName+")中...");
}
//mediaAdapter提供了播放其他文件格式的支持
else if ("vlc".equalsIgnoreCase(audioType)||"mp4".equalsIgnoreCase(audioType)){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType,fileName);
}else {
System.out.println("目前不支持"+audioType+"类型文件");
}
}
}
至此音频和视频的适配器已经完成,之后只需要调用AudioPlayer的play()方法即可。
测试
AdapterPatternDemo.java
package com.eric.结构型模式.适配器模式.例2.test;
import com.eric.结构型模式.适配器模式.例2.player.AudioPlayer;
/**
* @author Eric
* @ProjectName my_design_23
* @description 测试类
* @CreateTime 2020-11-30 17:48:32
*/
public class AdapterPatternDemo {
public static void main(String[] args) {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3","你妈炸了.mp3");
audioPlayer.play("mp4","飞翔的鸡儿.mp4");
audioPlayer.play("vlc","进击的小人儿.vlc");
audioPlayer.play("avi","岛国的生活.avi");
}
}
测试结果
![](https://img2020.cnblogs.com/blog/1989411/202012/1989411-20201229084952150-1063252075.png)