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. Drawable与Bitmap(转)

    Drawable                                                                                 以下这个是测试加载10 ...

  2. 【原创】FAT32系统硬盘的数据恢复实例,这篇文章也是从自己QQ空间的,转移过来的

    FAT32系统硬盘的数据恢复实例软件:win hex(16进制的编辑器)恢复内容:在FAT32中恢复一张图片1.首先我们格式化一个分区为空,让分区的系统选为FAT32系统格式化.如下: psb.jpg ...

  3. 【教训】rm -fr ./* 教训

    昨晚犯了一个重大错误,运行了 rm -rf ./* 本来是要删除一个不重要的目录的,结果在它的父目录下运行了上面命令,结果...都没了... 幸好数据库文件没有被删掉,数据还在,网站程序被删掉了,不久 ...

  4. POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)

    树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...

  5. noip 2012 借教室 (线段树 二分)

    /* 维护区间最小值 数据不超int 相反如果long long的话会有一组数据超时 无视掉 ll int */ #include<iostream> #include<cstdio ...

  6. angular.bind

    angular.bind :Returns a function which calls function fn bound to self (self becomes the this for fn ...

  7. OUTPUT 在insnert delete update 的神奇功效

    Inserted   deleted  个人理解 应该是两个 临时表   分别存储 变动后的数据集  和  变动前的数据集 使用例子: 1.对于INSERT,可以引用inserted表以查询新行的属性 ...

  8. SQL Database学习笔记

    1. linux下快速安装MariaDB: MariaDB 是 一个采用 Maria 存储引擎的  MySQL  分支版本,是由原来 MySQL 的作者 Michael Widenius 创办的公司所 ...

  9. StringBuilder和string.Format性能对比

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/sbformat.html StringBuilder的性能优于string.For ...

  10. ubuntu系统mysql.h no such file or directory

    在Ubuntu系统中,你已经安装了mysql,即你使用sudo apt-get install mysql-server mysql-client然而使用C语言访问mysql数据库时,却发现出现了如下 ...