Flutter开发04-设计模式基础

Flutter开发04-设计模式基础
type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: Dart 语言提供了一系列的运算符和编程机制,使得开发者能够以简洁、高效的方式编写代码。

Flutter开发04-设计模式基础

本文主要探索一些在Flutter开发中常用的设计模式。
Flutter 开发中,合理使用设计模式能让你的代码更健壮、更易维护。除了工厂模式(包括工厂方法和抽象工厂)和单例模式,还有其他一些非常实用的模式。
下面是一个表格汇总了 Flutter 中常用的设计模式及其核心应用场景:
设计模式
核心思想
Flutter 中的典型应用场景
单例 (Singleton)
确保一个类只有一个实例,提供全局访问点。
全局配置管理、日志记录器、网络请求客户端、共享状态(如用户登录状态)。
工厂方法 (Factory Method)
定义一个创建对象的接口,但让子类决定实例化哪个类。
根据条件创建不同类型的小部件或对象,避免在代码中直接使用大量条件判断。
抽象工厂 (Abstract Factory)
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。
创建整套UI主题组件、跨平台适配(如 Material 与 Cupertino 风格切换)。
观察者 (Observer)
定义对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并自动更新。
Flutter 响应式状态管理的核心(如 ChangeNotifierValueNotifiable),处理用户登录状态、网络连接状态等。
适配器 (Adapter)
将一个类的接口转换成客户期望的另一个接口,使接口不兼容的类可以协同工作。
封装第三方库或原生平台代码使其更易使用,统一不同数据源的接口。
策略 (Strategy)
定义一系列算法,将它们封装起来,并使它们可以互相替换,让算法的变化独立于使用算法的客户。
动态切换算法或行为(如排序算法、图片加载策略、支付方式选择)。
装饰器 (Decorator)
动态地给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。
在不改变原有对象的情况下,为 Widget 添加边框、阴影、点击效果等。
下面我们看一些代码例子和场景分析。

💡 单例模式 (Singleton)

确保一个类只有一个实例,并提供一个访问它的全局点。
使用场景:单例模式非常适合管理全局状态或资源,例如:
  • 应用配置:如 API 地址、应用主题、语言设置等。
  • 日志记录器:整个应用使用同一个日志记录实例。
  • 网络请求客户端:管理全局的请求配置和拦截器。
  • 数据库助手:管理对本地数据库的访问,避免多次打开连接。
  • 共享状态:如用户登录状态、购物车等。
注意:虽然单例很方便,但要避免滥用,因为它会引入全局状态,可能使测试变得困难并隐藏了组件的依赖关系。

🔧 工厂模式 (Factory)

工厂模式包括工厂方法模式 (Factory Method) 和抽象工厂模式 (Abstract Factory)。

1. 工厂方法模式 (Factory Method)

定义一个用于创建对象的接口,但让子类决定实例化哪一个类
使用场景
  • 根据条件创建不同风格的 Widget:如根据用户类型显示不同的按钮或卡片。
  • 封装复杂对象的创建过程:当对象的创建需要一系列步骤时,可以用工厂方法封装。

2. 抽象工厂模式 (Abstract Factory)

提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。它强调创建一系列相关产品
使用场景
  • 主题系统:确保一套 UI 组件(按钮、对话框、文本框)具有统一的风格。
  • 跨平台适配:为 Android 和 iOS 平台提供不同风格的组件。
  • 数据源切换:创建一系列相关的数据访问对象(如网络请求、本地数据库存储)。

🔍 观察者模式 (Observer)

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这是 Flutter 响应式编程和状态管理的核心。
Flutter 中的 ValueNotifierChangeNotifier是观察者模式的典型实现。
使用场景
  • 状态管理:这是 Flutter 中最常见的用途。像 ProviderRiverpodGetX等状态管理库的核心都基于观察者模式,用于管理用户登录状态、网络连接状态、主题切换等。
  • 事件总线:实现组件间的松散耦合通信。

🔄 适配器模式 (Adapter)

将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。
使用场景
  • 封装第三方库:使第三方库的接口更符合自己项目的使用习惯,未来更换库时只需修改适配器。
  • 统一数据接口:将不同来源(网络、本地数据库、缓存)的数据转换为统一的格式供 UI 使用。
  • 兼容旧代码:在新系统中需要与旧接口协同工作时。

🎯 策略模式 (Strategy)

定义一系列算法,将它们封装起来,并使它们可以互相替换,使得算法可以独立于使用它的客户而变化。
使用场景
  • 支付方式选择:用户可以在信用卡、支付宝、微信支付等不同策略间切换。
  • 图片加载策略:根据网络情况动态选择加载原图或缩略图的策略。
  • 排序算法:在不同的排序算法(如快速排序、归并排序)间灵活切换。
  • 数据验证规则:针对不同类型的输入(邮箱、手机号、密码)使用不同的验证策略。

✨ 装饰器模式 (Decorator)

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
在 Dart 语言中,Stream的很多方法(如 map, where, take)都返回新的 Stream,可以看作是装饰器模式的应用。
在 Flutter 中,许多 Widget 的设计也体现了装饰器模式的思想:
使用场景
  • 动态扩展对象功能:在不修改原有对象结构的情况下,动态地添加功能或责任。
  • Widget 装饰:为现有的 Widget 添加边框、背景、圆角、 padding 等,如 Container, Padding, DecoratedBox等 Widget 都扮演了装饰器的角色。
  • 主题和样式:为组件应用主题样式。

如何选择设计模式

选择设计模式时,考虑以下几点:
  1. 项目规模与复杂度:小型项目或原型开发可能用 MVC 或简单工厂就够了。大型复杂应用,尤其是状态交互频繁的,更适合 BLoCMVVM
  1. 团队熟悉度:选择团队熟悉且能熟练运用的模式,能提高开发效率和代码质量。
  1. 测试需求BLoC 等模式因逻辑与UI分离,可测试性通常更好
  1. 避免过度设计:如果需求很简单,强行套用复杂模式反而会让代码难以理解。

总结

设计模式是解决特定问题的经验总结,关键是理解其思想而非死记硬背。在 Flutter 开发中:
  • 熟练使用 单例工厂观察者 模式是基础。
  • 根据需求灵活运用适配器策略装饰器等模式能提升代码质量。
  • 结合 MVVMBLoC架构模式(它们常由多个设计模式组合而成)来组织整个应用。
希望这些解释和例子能帮助你更好地理解和应用设计模式。
上一篇
开发利器01-Git入门
下一篇
Flutter开发03-Dart高级
Loading...