设计模式简介
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 64 课,共 87 课。
设计模式是开发者在构建软件时反复遇到的常见问题的成熟解决方案。你不必每次都从头摸索,可以运用这些经过时间检验的模板来解决反复出现的设计难题。
你可以把设计模式看作蓝图。它们不会提供可供你直接复制粘贴的完整代码,而是描述如何组织类和对象,以解决特定类型的问题。你将学习的设计模式会运用你已经掌握的面向对象编程(OOP)概念:继承、接口、多态和组合。
设计模式分为三大类:
| 类别 | 用途 | 示例 |
|---|---|---|
| 创建型 | 对象的创建方式 | Singleton、Factory、Builder |
| 结构型 | 对象的组合方式 | Adapter、Decorator、Composite |
| 行为型 | 对象的通信方式 | Observer、Strategy、Command |
为什么要学习设计模式?它们能让你和其他开发者拥有共同的术语:说一句“这里使用工厂”,就能立刻传达一个复杂的想法。它们还能帮助你运用“面向接口编程,而不是面向实现”等原则,编写更灵活、更易维护的代码。
在接下来的课程中,你将实现几种重要的设计模式,先从单例模式和工厂模式等创建型模式开始,然后学习观察者模式和策略模式等行为型模式。
挑战
简单让我们来构建一个简单的模式分类器,展示你对三种设计模式类别的理解!你将创建一个系统,用来对模式进行分类并说明它们的用途,还要将代码分散到多个文件中。
你将创建三个文件:
Pattern.java:创建一个名为Pattern的接口,为所有设计模式定义契约。你的接口应声明两个方法:String getCategory(),用于返回模式的类别(Creational、Structural 或 Behavioral);以及String getPurpose(),用于返回对该类别模式用途的说明。PatternInfo.java:创建三个实现Pattern接口的类,分别代表一种设计模式类别:CreationalPattern:类别应返回"Creational",用途应返回"How objects are created"。StructuralPattern:类别应返回"Structural",用途应返回"How objects are composed"。BehavioralPattern:类别应返回"Behavioral",用途应返回"How objects communicate"。Main.java:把模式分类器组合起来!你将收到一个输入:模式名称(String),它会是"Singleton"、"Factory"、"Adapter"、"Decorator"、"Observer"或"Strategy"之一。根据输入,创建相应的模式对象:
"Singleton"和"Factory"属于创建型模式"Adapter"和"Decorator"属于结构型模式"Observer"和"Strategy"属于行为型模式
将模式对象存储在类型为
Pattern(即该接口)的变量中,以此展示面向接口编程的原则。然后打印以下三行:Pattern: [input pattern name]Category: [category from getCategory()]Purpose: [purpose from getPurpose()]
你将收到一个输入:设计模式的名称(String)。
这个挑战能帮助你巩固本课的关键认识:设计模式会根据其解决的问题进行分类。通过使用接口,你也在练习“面向接口编程,而不是面向实现编程”这一原则。这是让设计模式如此强大的核心概念!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String patternName = scanner.nextLine();
// TODO: 声明一个 Pattern 类型(接口)的变量
Pattern pattern = null;
// TODO: 根据 patternName 创建对应的模式对象:
// - "Singleton" 和 "Factory" 是创建型模式
// - "Adapter" 和 "Decorator" 是结构型模式
// - "Observer" 和 "Strategy" 是行为型模式
// TODO: 按以下格式打印输出:
// Pattern: [输入的模式名称]
// Category: [getCategory() 返回的类别]
// Purpose: [getPurpose() 返回的用途]
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器