适配器模式是一种结构型设计模式,允许不兼容对象协同工作,它将一个接口转换为另一个,使对象能够顺利交互。对象适配器通过创建包含被适配对象的适配器对象,并实现目标接口,实现适配器模式。在一个实战案例中,通过适配器模式,客户端(如 mediaplayer)可以播放高级格式的媒体(如 vlc),尽管其本身仅支持普通媒体格式(如 mp3)。
Java 设计模式之适配器模式的妙用
简介
适配器模式是一种结构型设计模式,它允许一个对象与另一个具有不兼容接口的对象协同工作。换句话说,它将一个接口转换为另一个接口,使原本不兼容的两个对象能够顺利交互。
立即学习“Java免费学习笔记(深入)”;
结构
适配器模式的结构如下图所示:
+--------------------+ | 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 类的源代码的情况下,扩展了它的功能,使其能够播放高级格式的媒体。
免责声明:本站内容仅用于学习参考,信息和图片素材来源于互联网,如内容侵权与违规,请联系我们进行删除,我们将在三个工作日内处理。联系邮箱:chuangshanghai#qq.com(把#换成@)