Adapter Pattern, 即适配器模式,用于连接两个不兼容的接口,属于结构类的设计模式。 或者叫做,转换器模式。

下面是一个转换器模式简单案例。

假设已有 AudioPlayer 专门播放 mp3 格式文件,VlcPlayer 和 Mp4Player 是高级播放器,分别播放 vlc 和  mp4 格式文件,客户端代码调用 AudioPlayer 来播放 mp3 格式的文件。

此时,不想修改 AudioPlayer 和 AdvanceMediaPlayer 的接口,也不希望修改客户端 AdapterPatternDemo 调用播放功能的方式,却能扩展地播放 vlc 和 mp4 格式的文件。

通过在 AudioPlayer 和 AdvanceMediaPlayer 直接增加一层适配器,能实现需要的效果。

代码实现:

AdvanceMediaPlayer 接口

public interface AdvanceMediaPlayer {

    public void playVlc(String fileName);

    public void playMp4(String fileName);
}

Mp4Player / VlcPlayer 类的实现,实现 AdvanceMediaPlayer 接口

public class Mp4Player implements AdvanceMediaPlayer {

    @Override
public void playVlc(String fileName) {
// do nothing
} @Override
public void playMp4(String fileName) {
System.out.println("Mp4player - playMp4 playing :" + fileName);
}
}
public class VlcPlayer implements AdvanceMediaPlayer {

    @Override
public void playVlc(String fileName) {
System.out.println("VlcPlayer - playVlc playing :" + fileName);
} @Override
public void playMp4(String fileName) {
// do nothings
}
}

MediaPlayer 接口

public interface MediaPlayer {

    public void play(String format, String fileName);
}

MediaAdapter ,提供播放 vlc 和 mp4 格式的转换功能

public class MediaAdapter implements MediaPlayer {

    AdvanceMediaPlayer vlcPlayer;
AdvanceMediaPlayer mp4Player; public MediaAdapter(){
vlcPlayer = new VlcPlayer();
mp4Player = new Mp4Player();
} @Override
public void play(String format, String fileName) {
if ("vlc".equals(format)){
vlcPlayer.playVlc(fileName);
}
else if ("mp4".equals(format)){
mp4Player.playMp4(fileName);
}
}
}

AudioPlayer,内置播放 mp3 格式功能,同时内含一个适配器用于播放其他格式文件

public class AudioPlayer implements MediaPlayer {

    private MediaAdapter mediaAdapter = new MediaAdapter();

    @Override
public void play(String format, String fileName) { if ("mp3".equals(format)){
System.out.println("AudioPlayer - paly : mp3 ");
}
else if ("mp4".equals(format) || "vlc".equals(format)){
mediaAdapter.play(format, fileName);
}
else{
System.out.println("Invalid format file");
}
}
}

演示代码,客户端 AdapterPatternDemo ,使用同一个接口、方式,即可播放除了 mp3 之外的其他格式文件。

public class AdapterPatternDemo {

    public static void main(){
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "aaa.mp3");
audioPlayer.play("mp4", "bbb.mp4");
audioPlayer.play("vlc", "bbb.vlc");
audioPlayer.play("qqq", "bbb.vlc");
}
}

参考资料

Design Patterns - Adapter Pattern, TutorialsPoint

[Design Pattern] Adapter Pattern 简单案例的更多相关文章

  1. java design pattern - adapter pattern

    场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B ...

  2. [Design Pattern] Facde Pattern 简单案例

    Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ...

  3. [Design Pattern] Front Controller Pattern 简单案例

    Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ...

  4. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  5. [Design Pattern] Mediator Pattern 简单案例

    Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ...

  6. [Design Pattern] Iterator Pattern 简单案例

    Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...

  7. [Design Pattern] Command Pattern 简单案例

    Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...

  8. [Design Pattern] Proxy Pattern 简单案例

    Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ...

  9. [Design Pattern] Flywight Pattern 简单案例

    Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...

随机推荐

  1. java的通信机制

    通信机制无非就那几种:http访问.socket访问: http又分为:jsp.servlet.html,用的就是get和post方法 socket则可分为:tcp或者udp方式 从以上内容又衍生出其 ...

  2. 在Ubuntu上安装使用Systemtap

    因为最近开始学习Nginx,在网上看到别人介绍了一款强大的内核探测工具Systemtap,于是便准备学习下这款探测工具为以后代码分析做准备. 第一步便是安装.在自己电脑上安装的时候,也是费了一番劲儿. ...

  3. ASP.NET面试

    1.net中读写数据库需要用到那些类?他们的作用都是什么?答:DataSet:数据存储器.DataCommand:执行语句命令.DataAdapter:数据的集合,用语填充.2.介绍一下什么是Code ...

  4. jQuery的css()方法

    jQuery的css()方法下面的代码可以为div一次性设置多个样式属性<!DOCTYPE html><html><head><meta charset=&q ...

  5. 四、分离T4引擎

         在前几篇文章中,我使用大量的篇幅来介绍T4在VisualStudio中如何使用.虽然在一定程度上可以提高我们的工作效率,但并没有实质上的改变.不过从另一方面来说,我们确实了解到了T4的强大. ...

  6. android - INSTALL_FAILED_MEDIA_UNAVAILABLE

    解决方案是将'AndroidManifest.xml'设置 'installLocation'的属性为'auto'即可.

  7. 016_openxml_forxml

    016_openxml_forxml --openxml*********************************************************************** ...

  8. How do I size a UITextView to its content?

    UITextView 自适应高度,搬来一篇stack上的:   Is there a good way to adjust the size of a UITextView to conform to ...

  9. javascript基础学习(十二)

    javascript之BOM 学习要点: 屏幕对象 History对象 Location对象 一.屏幕对象 Screen对象是一个由javascript自动创建的对象,该对象的主要作用是描述客户端的显 ...

  10. Hibernate 持久化对象的状态

    持久化对象有3种状态:1.持久化状态      2.临时状态      3.游离状态 Session 的特定方法能使对象从一个状态转换到另一个状态临时对象(transient)•    在使用代理主键 ...