设计模式入门
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 51 课,共 70 课。
设计模式是针对开发者在构建软件时反复遇到的常见问题而经过验证的解决方案。模式为我们提供了一套共同的术语和经过测试的代码组织方法,让我们不必每次都从头摸索。
把设计模式想象成蓝图。它们不会给你可以直接复制的确切代码,而是描述如何组织类和对象来解决特定挑战。当有人提到“在这里使用 Factory 模式”时,有经验的开发者会立即理解所提议的大致结构。
设计模式分为三大类:
| 类别 | 用途 | 示例 |
|---|---|---|
| 创建型 | 对象的创建方式 | Singleton,Factory |
| 结构型 | 对象的组合方式 | Adapter,Decorator |
| 行为型 | 对象的通信方式 | Observer,Strategy |
我们要探讨的模式直接建立在你已经学过的面向对象编程概念之上,包括接口、继承、多态和组合。每种模式都会以特定方式运用这些基础概念,以实现灵活性、可维护性或可复用性。
在接下来的课程中,你将从 Singleton、Factory、Observer 和 Strategy 开始,实现几个重要的模式。理解这些模式有助于你识别现有代码库中的常见解决方案,并在自己的项目中做出更好的架构决策。
挑战
简单让我们构建一个简单的模式目录系统,用多个文件整理设计模式信息。这能帮助你了解模式如何分类,同时练习良好的代码组织方式。
你将创建三个文件,分别负责不同的内容:
Pattern.cs:在Patterns命名空间中定义一个Pattern类,用来表示单个设计模式。每个模式都应包含Name、Category(Creational、Structural 或 Behavioral)和Description。添加一个GetSummary()方法,返回格式化字符串:[{Category}] {Name}: {Description}PatternCatalog.cs:在Patterns命名空间中创建一个PatternCatalog类,用于管理模式集合。目录应能添加模式,并包含一个GetPatternsByCategory(string category)方法,返回所有类别匹配的模式列表。还要添加一个GetAllSummaries()方法,返回目录中所有模式的摘要字符串列表。Program.cs:创建目录,并根据输入填充模式,将所有内容整合起来。然后显示按类别筛选后的模式。
你将收到以下输入:
- 要添加的模式数量
- 每个模式包含三行:名称、类别和描述
- 用于筛选的类别
将所有模式添加到目录后,打印与筛选类别匹配的模式摘要,每行一条。如果没有匹配的模式,则打印 No patterns found。
例如,输入如下:
3
Singleton
Creational
Ensures only one instance exists
Observer
Behavioral
Notifies dependents of state changes
Factory
Creational
Creates objects without specifying exact class
Creational输出应为:
[Creational] Singleton: Ensures only one instance exists
[Creational] Factory: Creates objects without specifying exact class这个挑战展示了如何将相关类整理到不同文件中,让代码库保持简洁且易于维护。随着你在后续课程中实现真正的设计模式,这一原则会变得更加重要!
亲手试试
using System;
using System.Collections.Generic;
using Patterns;
class Program
{
public static void Main(string[] args)
{
// 读取模式的数量
int n = Convert.ToInt32(Console.ReadLine());
// 创建一个新的 PatternCatalog
PatternCatalog catalog = new PatternCatalog();
// TODO:读取每个模式的详细信息(名称、类别、描述)
// 并将它们添加到目录中
for (int i = 0; i < n; i++)
{
string name = Console.ReadLine();
string category = Console.ReadLine();
string description = Console.ReadLine();
// TODO:创建一个 Pattern,并将其添加到目录中
}
// 读取用于筛选的类别
string filterCategory = Console.ReadLine();
// TODO:获取符合筛选类别的模式
// 并输出它们的摘要
// 如果没有匹配的模式,输出 "No patterns found"
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器