适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如 mediaplayer)可以播放高级格式的媒体(如 vlc),尽管其本身仅支持普通媒体格式(如 mp3)。

Java 设计模式之适配器模式的妙用
简介
适配器模式是一种结构型设计模式,它允许一个对象与另一个具有不兼容接口的对象协同工作。换句话说,它将一个接口转换为另一个接口,使原本不兼容的两个对象能够顺利交互。
立即学习“Java免费学习笔记(深入)”;
结构
适配器模式的结构如下图所示:
HTShop网上购物系统由恒天网络科技有限公司根据国际先进技术和国内商务特点自主版权开发的一款具有强大功能的B2C电子商务网上购物平台。HTShop以国际上通用流行的B/S(浏览器/服务器)模式进行设计,采用微软公司的ASP.NET(C#)技术构建而成。 2007-11-10 HTShop CS 通用标准版 v1.1.11.10 更新内容自由更换模版功能开放 修改了购买多款商品,会员中心订单只显示
+--------------------+
| Target |
+--------------------+
^
|
+--------------------+
| Adaptee(被适配) |
+--------------------+
^
|
+----------------------------+
| Object Adapter (对象适配器) |
+----------------------------+
| |
\_______________/- Target (目标):定义客户端需要的接口。
- Adaptee (被适配):定义要被适配的接口。
- Adapter (适配器):将 Adaptee 接口转换为 Target 接口,从而使客户端能够使用 Adaptee。
对象适配器
对象适配器是一种实现适配器模式的简单方式。它创建了一个新的适配器对象,该对象将 Adaptee 对象包含在其中并实现 Target 接口。
// Target 接口
interface Target {
int operation();
}
// Adaptee 接口
interface Adaptee {
int specificOperation();
}
// Adapter (对象适配器)
class Adapter implements Target {
private final Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public int operation() {
return adaptee.specificOperation();
}
}实战案例
假设我们有两个类:MediaPlayer 和 AdvancedMediaPlayer。MediaPlayer 类负责播放普通格式的媒体(如 MP3),而 AdvancedMediaPlayer 类负责播放高级格式的媒体(如 VLC)。我们要使用适配器模式来使 MediaPlayer 类能够播放高级格式的媒体。
class MediaPlayer {
public void playMP3(String filename) {
System.out.println("Playing MP3: " + filename);
}
}
class AdvancedMediaPlayer {
public void playVLC(String filename) {
System.out.println("Playing VLC: " + filename);
}
}
class MediaAdapter implements MediaPlayer {
private final AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(AdvancedMediaPlayer advancedMediaPlayer) {
this.advancedMediaPlayer = advancedMediaPlayer;
}
@Override
public void playMP3(String filename) {
advancedMediaPlayer.playVLC(filename);
}
}
// 客户调用
MediaPlayer audioPlayer = new MediaAdapter(new AdvancedMediaPlayer());
audioPlayer.playMP3("FileName.vlc");输出:
Playing VLC: FileName.vlc
通过使用适配器模式,我们在不修改 MediaPlayer 类的源代码的情况下,扩展了它的功能,使其能够播放高级格式的媒体。










