适配器
字数: 0 字 时长: 0 分钟
简介
适配器模式(Adapter Pattern)核心思想是:通过创建一个中间层(适配器),将一个类的接口转换为客户期望的另一个接口。
UML 类图
- 目标接口(Target):客户端希望使用的接口
- 适配器(Adapter):实现了目标接口,通过委托的方式将请求转换为适配的接口调用
- 被适配者(Adaptee):需要被适配的已有组件
实现示例
以改造老的播放接口适配新的多格式播放接口为例:
java
// 1. 目标接口 (多格式播放播放器)
interface AudioPlayer {
void play(String audioType, String fileName);
}
// 2. 被适配者(已有实现)
interface OldPlayer {
void play(String fileName);
}
class Mp4Player implements OldPlayer{
@Override
public void play(String fileName) {
System.out.println("播放 mp4 文件: " + fileName);
}
}
class Mp3Player implements OldPlayer{
@Override
public void play(String fileName) {
System.out.println("播放 mp3 文件: " + fileName);
}
}
// 3. 适配器
class PlayerAdapter implements AudioPlayer {
private Player player;
public PlayerAdapter(String playerType) {
if ("mp4".equalsIgnoreCase(playerType)) {
player = new Mp4Player();
}else if ("mp3".equalsIgnoreCase(playerType)) {
player = new Mp3Player();
}
}
@Override
public void play(String audioType, String fileName) {
player.play(fileName);
}
}
// 4. 默认播放器支持 mp4,其他交给适配器
class DefaultAudioPlayer implements AudioPlayer {
private PlayerAdapter playerAdapter;
@Override
public void play(String audioType, String fileName) {
if ("mp4".equalsIgnoreCase(audioType)) {
System.out.println("播放 mp4 文件: " + fileName);
}else if ("mp4".equalsIgnoreCase(audioType)
|| "mp3".equalsIgnoreCase(audioType)) {
playerAdapter = new PlayerAdapter(audioType);
playerAdapter.play(audioType, fileName);
}else {
System.out.println("不支持该格式: " + audioType);
}
}
}
// 5. 客户端调用
public static void main(String[] args) {
AudioPlayer audioPlayer = new DefaultAudioPlayer();
audioPlayer.play("mp4", "电影.mp4");
audioPlayer.play("mp3", "音乐.mp3");
}