[Design Pattern] Adapter Pattern 简单案例
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 简单案例的更多相关文章
- java design pattern - adapter pattern
		场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B ... 
- [Design Pattern] Facde Pattern 简单案例
		Facade Pattern, 即外观模式,用于隐藏复杂的系统内部逻辑,提供简洁的接口给客户端调用,属于结构类的设计模式.我会将其名字理解为,门户模式. 下面是 Facade Pattern 的一个简 ... 
- [Design Pattern] Front Controller Pattern 简单案例
		Front Controller Pattern, 即前端控制器模式,用于集中化用户请求,使得所有请求都经过同一个前端控制器处理,处理内容有身份验证.权限验证.记录和追踪请求等,处理后再交由分发器把请 ... 
- [Design Pattern] Observer Pattern 简单案例
		Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ... 
- [Design Pattern] Mediator Pattern 简单案例
		Meditor Pattern,即调解模式,用一个调解类类处理所有的沟通事件,使得降低多对象之间的沟通难度,属于行为类的设计模式.为了方便理解记忆,我也称其为,沟通模式. 下面是一个调解模式的简单案例 ... 
- [Design Pattern] Iterator Pattern 简单案例
		Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ... 
- [Design Pattern] Command Pattern 简单案例
		Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ... 
- [Design Pattern] Proxy Pattern 简单案例
		Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage ... 
- [Design Pattern] Flywight Pattern 简单案例
		Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ... 
随机推荐
- Android Xutils 框架
			XUtils是git上比较活跃 功能比较完善的一个框架,是基于afinal开发的,比afinal稳定性提高了不少,下面是介绍: 鉴于大家的热情,我又写了一篇Android 最火框架XUtils之注解机 ... 
- __name__属性
			#coding=utf-8#首先我们分别看一下这个模块在不同场景中的__name__的值print __name__ #其次我们看一下__name__属性的常用情况if __name__==" ... 
- MVC4使用EF6连接mysql数据库
			1.需要安装MySql.Data.Entity.EF6,此dll可以在项目——>管理NuGet程序包里联机搜索MySql.Data.Entity.EF6并安装即可 2.连接字符串需要添加prov ... 
- HDU5303
			题意:给定一个环形道路长度为L,以及环形道路下标为0处为起始点,在环形道路上距离起始点Xi位置种植一颗苹果树,该树有a个苹果,篮子的最大容量为K,那么求摘完全部苹果所需的最短距离. 思路:之前没想出来 ... 
- WorkBook的SaveAs方法 2
			-----转载:http://blog.csdn.net/zyming0815/article/details/5939104 语法 声明Sub SaveAs ( _ Filename As ... 
- Objective-C学习篇04—多态
			多态 多态的概念 有这样一个例子.早上我和同事说口渴了.结果:A同事拿着我的水杯去给我接了一杯水.B同事顺手在饮水机上拿了一次性纸杯给我接了杯水.C同事给了我一瓶他早上刚买的饮料.同事们得到的是同样的 ... 
- protocol buffer VS 2013编译出错
			protocol buffer 在VS2013编译会出现以下错误. 解决办法 把宏加上, 问题解决. 注: 该错误只出现在Debug版本. 
- cmakelists 语法学习
			1.项目最外层cmake编写:----------用于kdevelop编译器 project(filtering) cmake_minimum_required(VERSION 2.8) ————必须 ... 
- windows 7下安装python+mongodb
			1. python安装 下载:http://python.org/download/ 直接双击安装,安装完后将路径加入系统环境变量path中. 2. mongodb安装 下载:http://www.m ... 
- PHP获取当前文件路径信息的方法
			文件名 test.php 1.__FILE__ 获取 “路径 + 文件名” : /var/www/test/test.php echo __FILE__; //取得当前文件的路径:用魔术常量 __ ... 
