[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, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...
随机推荐
- Drawable与Bitmap(转)
Drawable 以下这个是测试加载10 ...
- 【原创】FAT32系统硬盘的数据恢复实例,这篇文章也是从自己QQ空间的,转移过来的
FAT32系统硬盘的数据恢复实例软件:win hex(16进制的编辑器)恢复内容:在FAT32中恢复一张图片1.首先我们格式化一个分区为空,让分区的系统选为FAT32系统格式化.如下: psb.jpg ...
- 【教训】rm -fr ./* 教训
昨晚犯了一个重大错误,运行了 rm -rf ./* 本来是要删除一个不重要的目录的,结果在它的父目录下运行了上面命令,结果...都没了... 幸好数据库文件没有被删掉,数据还在,网站程序被删掉了,不久 ...
- POJ 1655 Balancing Act&&POJ 3107 Godfather(树的重心)
树的重心的定义是: 一个点的所有子树中节点数最大的子树节点数最小. 这句话可能说起来比较绕,但是其实想想他的字面意思也就是找到最平衡的那个点. POJ 1655 题目大意: 直接给你一棵树,让你求树的 ...
- noip 2012 借教室 (线段树 二分)
/* 维护区间最小值 数据不超int 相反如果long long的话会有一组数据超时 无视掉 ll int */ #include<iostream> #include<cstdio ...
- angular.bind
angular.bind :Returns a function which calls function fn bound to self (self becomes the this for fn ...
- OUTPUT 在insnert delete update 的神奇功效
Inserted deleted 个人理解 应该是两个 临时表 分别存储 变动后的数据集 和 变动前的数据集 使用例子: 1.对于INSERT,可以引用inserted表以查询新行的属性 ...
- SQL Database学习笔记
1. linux下快速安装MariaDB: MariaDB 是 一个采用 Maria 存储引擎的 MySQL 分支版本,是由原来 MySQL 的作者 Michael Widenius 创办的公司所 ...
- StringBuilder和string.Format性能对比
本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/sbformat.html StringBuilder的性能优于string.For ...
- ubuntu系统mysql.h no such file or directory
在Ubuntu系统中,你已经安装了mysql,即你使用sudo apt-get install mysql-server mysql-client然而使用C语言访问mysql数据库时,却发现出现了如下 ...