设计模式简介
本课属于 Coddy PHP 学习旅程的“面向对象编程”单元。第 70 课,共 91 课。
设计模式是经过验证的解决方案,用于解决开发者在构建软件时反复遇到的常见问题。你可以在自己的代码中应用这些成熟的模板来解决类似的挑战,而不必每次都从头开始。
把设计模式想象成菜谱。厨师按照菜谱烹制经过时间打磨的菜肴,开发者也会使用设计模式来组织代码。这些模式经过无数程序员的测试和改进。
设计模式通常分为三类:
| 类别 | 用途 | 示例 |
|---|---|---|
| 创建型 | 对象的创建方式 | 单例、工厂 |
| 结构型 | 对象的组合方式 | 适配器、装饰器 |
| 行为型 | 对象的通信方式 | 观察者、策略 |
其实,你在这门课程中一直在使用设计模式,只是没有意识到。当你创建带有方法的抽象类,并要求子类实现这些方法时,你就在应用模板方法模式。当你使用接口定义约定时,你就在为策略模式做准备。
学习设计模式能让你和其他开发者拥有共同的术语。无需详细解释复杂的结构,你只需说“我在这里使用了 Factory 模式”,有经验的开发者就能立刻理解你的做法。在接下来的几课中,我们会在 PHP 中实现几种重要的模式。
挑战
简单让我们构建一个简单的消息格式化系统,来演示设计模式如何帮助组织代码。你将识别每个组件所属的模式类别,并了解系统的不同部分如何协同工作。
你将把代码分成三个文件:
MessageFormatter.php:创建一个名为MessageFormatter的接口,为消息格式化定义一份约定。它应包含一个方法format(string $message): string。这属于行为型类别。它定义了对象如何通信和处理数据。Formatters.php:引入 MessageFormatter 文件,并创建两个实现该接口的类:UppercaseFormatter:它的format()方法会返回转换为大写的消息BracketFormatter:它的format()方法会用方括号括起消息,例如[message]
main.php:引入 Formatters 文件。你会收到两个输入:一条消息字符串和一种格式化器类型("upper"或"bracket")。创建一个名为
processMessage的函数,它接收一个MessageFormatter和一条消息字符串,然后返回格式化后的结果。这个函数不需要知道收到的是哪种具体的格式化器,只需对传入的对象调用format()。根据格式化器类型的输入,创建相应的格式化器对象。将它和消息一起传给
processMessage函数,然后打印结果。在新的一行中,打印这种结构代表的模式类别。由于我们通过接口定义了可互换的行为,请打印:
Pattern category: Behavioral
这个挑战展示了接口如何让你替换实现,而不必更改使用这些实现的代码。这是策略等模式的基础,你将在接下来的课程中学习这些模式。
亲手试试
<?php
require_once 'Formatters.php';
// 读取输入
$message = trim(fgets(STDIN));
$formatterType = trim(fgets(STDIN));
// TODO: 创建一个名为 processMessage 的函数,接收一个 MessageFormatter
// 和一个消息字符串,然后返回格式化后的结果
// TODO: 根据 $formatterType("upper" 或 "bracket")创建对应的格式化器
// TODO: 用格式化器和消息调用 processMessage,然后打印结果
// TODO: 在新的一行打印模式类别
// 格式:"Pattern category: Behavioral"
?>这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: PHP 在线编译器