Dart设计模式之适配器模式

dart设计模式之适配器模式

适配器模式

模式分析

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

模式难点
模式解决问题

主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

优点
  1. 可以让任何两个没有关联的类一起运行。
  2. 提高了类的复用。
  3. 增加了类的透明度。
  4. 灵活性好。
缺点
  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 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,这里特意联合了阿里P7架构师和谷歌技术团队共同整理了一份Flutter全家桶学习资料。

内容概要:Flutter技术解析与实战、Flutter进阶学习笔记、Flutter入门与实战和Flutter完整开发实战详解。
内容特点:条理清晰,含图像化表示更加易懂。

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要 Flutter技术解析与实战 完整文档的可扫描下方卡片免费获取!

目录

在这里插入图片描述

第一章 为什么 Flutter 是跨平台开发 的终极之选

  • 01 这是为什么?
  • 02 跨平台开发
  • 03 什么是 Flutter
  • 04 Flutter 的特性

在这里插入图片描述

第二章 在 Windows 上搭建 Flutter 开发环境

  • 01 使用镜像
  • 02 系统要求
  • 03 获取 Flutter SDK
  • 04 编辑器设置
  • 05Android 设置

在这里插入图片描述

第三章 编写您的第一个 Flutter App

在这里插入图片描述

第四章 Flutter 开发环境搭建和调试

  • 1.开发环境的搭建
  • 2.模拟器的安装与调试
  • 3.开发环境的搭建
  • 4.模拟器的安装与调试

在这里插入图片描述

第五章 Dart 语法篇之基础语法(一)

一、Hello Dart
二、数据类型
三、变量和常量
四、集合(List、Set、Map)
五、流程控制
六、运算符
七、异常
八、函数

在这里插入图片描述

第六章 Dart 语法篇之集合的使用与源码 解析(二)

一、List
二、Set
三、Map
四、Queue
五、LinkedList
六、HashMap
七、Map、HashMap、LinkedHashMap、SplayTreeMap
区别

八、命名构造函数 from 和 of 的区别以及使用建议

在这里插入图片描述

第七章 Dart 语法篇之集合操作符函数与 源码分析(三)

  • List item

在这里插入图片描述

第八章 Dart 语法篇之函数的使用(四)

在这里插入图片描述

第九章 Dart 语法篇之面向对象基础(五)

在这里插入图片描述

第十章 Dart 语法篇之面向对象继承和 Mixins(六)

在这里插入图片描述

第十二章 Dart 语法篇之类型系统与泛型 (七)

在这里插入图片描述

第十三章 Flutter 中的 widget

在这里插入图片描述