设计模式简介
本课属于 Coddy Dart 学习旅程的“面向对象编程”单元。第 89 课,共 110 课。
设计模式是经过验证的解决方案,用于解决开发者在构建软件时反复遇到的常见问题。你不必每次都从头开始,而是可以应用这些成熟的模板,以一致且易于维护的方式解决类似的挑战。
把设计模式想象成食谱。厨师不会每次都发明一种制作面包的新方法,程序员也会使用经过数十年改进的模式。这些模式利用你已经学过的面向对象编程(OOP)概念,例如类、继承、接口和多态,并以特定方式将它们组合起来,解决具体问题。
设计模式通常分为三类:
| 类别 | 用途 | 示例 |
|---|---|---|
| 创建型 | 对象的创建方式 | 单例、工厂 |
| 结构型 | 对象的组合方式 | 适配器、装饰器 |
| 行为型 | 对象的通信方式 | 观察者、策略 |
在接下来的课中,你将学习每个类别中的具体模式。每种模式都解决一个不同的问题:确保一个类只有一个实例、在不指定具体类的情况下创建对象,或让对象通知其他对象发生了变化。了解何时以及为何使用每种模式,与了解如何实现它同样重要。
挑战
简单我们来构建一个简单的问题解决系统,展示设计模式如何按类别组织代码!你将创建一种结构,用于对不同的软件挑战进行分类,并建议可能有助于解决问题的模式类型。
你将把代码分成两个文件:
patterns.dart:创建一个名为PatternCategory的枚举,包含三个值:creational、structural和behavioral。每个值都应有一个String description字段,用来说明其用途:creational:“Handles object creation”structural:“Handles object composition”behavioral:“Handles object communication”
Problem的类,用来表示软件挑战。它应包含一个String name字段和一个PatternCategory category字段。添加一个suggest()方法,返回以下格式的字符串:[name] -> Use a [category description] patternmain.dart:导入你的模式文件,并演示不同的问题如何对应不同的模式类别。创建三个Problem实例:- 名称为
Ensure single database connection、类别为creational的问题 - 名称为
Make old API work with new system、类别为structural的问题 - 名称为
Notify users when data changes、类别为behavioral的问题
suggest(),并打印结果。- 名称为
这个挑战能帮助你了解设计模式如何根据所解决的问题类型进行分类。这是你开始学习后续课程中的具体模式时需要掌握的关键概念!
预期输出:
Ensure single database connection -> Use a Handles object creation pattern
Make old API work with new system -> Use a Handles object composition pattern
Notify users when data changes -> Use a Handles object communication pattern亲手试试
import 'patterns.dart';
void main() {
// TODO: 创建 3 个 Problem 实例:
// 1. name: "Ensure single database connection",category: creational
// 2. name: "Make old API work with new system",category: structural
// 3. name: "Notify users when data changes",category: behavioral
// TODO: 对每个问题调用 suggest() 并打印结果
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Dart 在线编译器