dart设计模式之适配器模式
适配器模式
模式分析
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
模式难点
模式解决问题
主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
优点
- 可以让任何两个没有关联的类一起运行。
- 提高了类的复用。
- 增加了类的透明度。
- 灵活性好。
缺点
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
模式应用场景
有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
模式代码
import 'run.dart';
//官方媒体播放接口
abstract class MediaPlayer {
void play(String audioType, String fileName);
}
//自定义媒体播放接口
abstract class AdvancedMediaPlayer {
void playVlc(String fileName);
void playMp4(String fileName);
}
//创建实现了 AdvancedMediaPlayer 接口的实体类。
class VlcPlayer implements AdvancedMediaPlayer {
@override
void playMp4(String fileName) {}
@override
void playVlc(String fileName) {
print("Playing vlc file. Name: " + fileName);
}
}
class Mp4Player implements AdvancedMediaPlayer {
@override
void playVlc(String fileName) {
//什么也不做
}
@override
void playMp4(String fileName) {
print("Playing mp4 file. Name: " + fileName);
}
}
// 创建实现了 MediaPlayer 接口的适配器类。
class MediaAdapter implements MediaPlayer {
AdvancedMediaPlayer advancedMusicPlayer;
MediaAdapter(String audioType) {
if (audioType == "vlc") {
advancedMusicPlayer = new VlcPlayer();
} else if (audioType == "mp4") {
advancedMusicPlayer = new Mp4Player();
}
}
@override
void play(String audioType, String fileName) {
if (audioType == "vlc") {
advancedMusicPlayer.playVlc(fileName);
} else if (audioType == "mp4") {
advancedMusicPlayer.playMp4(fileName);
}
}
}
// 创建实现了 MediaPlayer 接口的实体类。
class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;
@override
void play(String audioType, String fileName) {
//播放 mp3 音乐文件的内置支持
if (audioType == "mp3") {
print("Playing mp3 file. Name: " + fileName);
}
//mediaAdapter 提供了播放其他文件格式的支持
else if (audioType == "vlc" || audioType == "mp4") {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
} else {
print("Invalid media. " + audioType + " format not supported");
}
}
}
class RunAdapter implements Run {
@override
main() {
AudioPlayer audioPlayer = new AudioPlayer();
audioPlayer.play("mp3", "beyond the horizon.mp3");
audioPlayer.play("mp4", "alone.mp4");
audioPlayer.play("vlc", "far far away.vlc");
audioPlayer.play("avi", "mind me.avi");
}
@override
String name = "适配器模式";
}
最后
这里也为想要学习Flutter的朋友们准备了两份学习指南《Flutter Dart语言编程入门到精通》《Flutter实战》,从编程语言到项目实战,一条龙服务!!
《Flutter Dart 语言编程入门到精通》
-
第一章 Dart语言基础
-
第二章 Dart 异步编程
-
第三章 异步之 Stream 详解
-
第四章 Dart标准输入输出流
-
第五章 Dart 网络编程
-
第六章 Flutter 爬虫与服务端
-
第七章 Dart 的服务端开发
-
第八章 Dart 调用C语言混合编程
-
第九章 LuaDardo中Dart与Lua的相互调用
《Flutter实战:第二版》
- 第一章:起步
- 第二章:第一个Flutter应用
- 第三章:基础组件
- 第四章:布局类组件
- 第五章:容器类组件
-
第六章:可滚动组件
-
第七章:功能型组件
-
第八章:事件处理与通知
-
第九章:动画
-
第十章:自定义组件
-
第十一章:文件操作与网络请求
-
第十二章:Flutter扩展
-
第十三章:国际化
-
第十四章:Flutter核心原理
-
第十五章:一个完整的Flutter应用
有需要学习手册的朋友可以 关注公众号:Android老皮领取