23种设计模式-0设计模式入门
设计模式入门
前言
适合阅读本专栏的人群包括:
- 想提升代码质量和架构思维的 Java 开发者
- 在工作中面对复杂业务、代码难以维护的工程师
- 想准备面试、系统复习设计模式知识的同学
阅读完本专栏,你将掌握:
- 23 种设计模式的结构、适用场景和最佳实践
- 面向对象六大设计原则的使用方式
- 如何用设计模式解决常见业务场景问题
- 如何重构低质量代码,提升扩展性与可维护性
任何问题都可以在留言区指出,作者看到后会第一时间回复。
概念总是生僻的,可以结合代码多体会多练习。
本系列文章会以每周最少3篇的速度持续更新。
如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。
为什么要学习设计模式?
很多人将编程能力比作武术修为,将 设计模式 比作是武术中的内功。修过仙的同学们应该都知道,没有内功的招式都是假把式。
我在参加工作的前两年经历了三个也算比较大型的项目,其中几乎很少用到设计模式,工作中更多的是直白的CRUD,所以对设计模式不重视也没有特意学过这部分内容。但是在我换了东家后的一个项目中,我几乎能在核心代码中看到全部设计模式的应用。这些设计模式在我之后对项目开发维护中带来了许多便利,也让我切身体会到设计模式的伟大。
很多言论认为使用设计模式会使代码难以阅读,对于新手是不友好的,同时还可能会导致过度设计。
其实大家都是从不懂到懂一点点过来的,永远不要畏难,因害怕过度设计而不用设计模式显然是因噎废食。
如果有小伙伴在代码中使用了设计模式我会夸一句:优雅!
什么是设计模式?
1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
设计模式是软件开发中常见问题的通用解决方案。它们是被反复应用的经验总结,提供了在特定环境下解决特定问题的模板。设计模式并不是具体的代码,而是一种思考问题和解决问题的方式,可以帮助开发者以更高效、可维护和可复用的方式编写软件。
我在笔记中使用 Java 作为编程语言,但是设计模式并不是 Java 的专利,它同样适用于 C++,C#,JavaScript 等其它面向对象的编程语言。
我们常说的设计模式一般指23种,但现在的设计模式已经远远不止23种。
设计模式的分类
- 创建型模式(Creational):关注对象的实例化过程,包括了如何实例化对象、隐藏对象的创建细节等。常见的创建型模式有单例模式、工厂模式、抽象工厂模式等。
- 结构型模式(Structural):关注对象之间的组合方式,以达到构建更大结构的目标。这些模式帮助你定义对象之间的关系,从而实现更大的结构。常见的结构型模式有适配器模式、装饰器模式、代理模式等。
- 行为型模式(Behavioral):关注对象之间的通信方式,以及如何合作共同完成任务。这些模式涉及到对象之间的交互、责任分配等。常见的行为型模式有观察者模式、策略模式、命令模式等。
设计模式概览
有详细介绍的设计模式会标为链接状态,大家也可以到专栏中查看
| 类型 | 名称 |
|---|---|
| 创建型模式(5) | 工厂模式(Factory Pattern) |
| 抽象工厂模式(Abstract Factory Pattern) | |
| 单例模式(Singleton Pattern) | |
| 建造者模式(Builder Pattern) | |
| 原型模式(Prototype Pattern) | |
| 结构型模式(7) | 适配器模式(Adapter Pattern) |
| 桥接模式(Bridge Pattern) | |
| 组合模式(Composite Pattern) | |
| 装饰器模式(Decorator Pattern) | |
| 外观模式(Facade Pattern) | |
| 享元模式(Flyweight Pattern) | |
| 代理模式(Proxy Pattern) | |
| 行为型模式(11) | 责任链模式(Chain of Responsibility Pattern) |
| 命令模式(Command Pattern) | |
| 迭代器模式(Iterator Pattern) | |
| 解释器(Interpreter Pattern) | |
| 中介者模式(Mediator Pattern) | |
| 备忘录模式(Memento Pattern) | |
| 观察者模式(Observer Pattern) | |
| 状态模式(State Pattern) | |
| 策略模式(Strategy Pattern) | |
| 模板模式(Template Pattern) | |
| 访问者模式(Visitor Pattern) |
面向对象的设计原则
面向对象设计原则(Object-Oriented Design Principles)是一组指导原则,帮助开发人员创建灵活、可维护和可扩展的软件系统。
在面向对象设计中需要尽量遵循这些原则。
| 名称 | 定义 |
|---|---|
| 单一职责原则(Single Responsibility Principle, SRP) | 一个类只负责一个功能领域中的相应职责 |
| 开闭原则(Open-Closed Principle, OCP) | 软件实体应对扩展开放,而对修改关闭 |
| 里氏代换原则(Liskov Substitution Principle, LSP) | 所有引用基类对象的地方能够透明地使用其子类的对象 |
| 依赖倒转原则(Dependence Inversion Principle, DIP) | 抽象不应该依赖于细节,细节应该依赖于抽象 |
| 接口隔离原则(Interface Segregation Principle, ISP) | 使用多个专门的接口,而不使用单一的总接口 |
| 合成复用原则(Composite Reuse Principle, CRP) | 尽量使用对象组合,而不是继承来达到复用的目的 |
| 迪米特法则(Law of Demeter, LoD) | 一个软件实体应当尽可能少地与其他实体发生相互作用 |
UML类图
统一建模语言 UML (Unified Modeling Language) 类图是一种用于描述系统结构的图形化工具。它以类和对象为基础,主要用于表示系统中的类、接口、继承关系、关联关系等元素,以及它们之间的静态结构和关系。
类图的作用:
(1):在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解;
(2):类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。
如何表示一个类?

类名:图中 最上面 的矩形框中为类名。(如果字体为 斜体,表示为 抽象类)
类的属性:类名下方的区域。
格式:[可见性] [属性名称] : [类型] = { 默认值,可选 }
类的方法:图中的下面部分。
格式:[可见性] [方法名称] ([参数名 : 参数类型, …]) : [返回值类型]
冒号 : 前是 方法名/变量名(根据有无括号区分)
冒号后 : 是 返回参数/变量类型(根据有无括号区分)
如果没有冒号的话表示 方法返回空(也有人通过:void表示返空)
说明:属性和方法 前面的 “+” “-” 和 “#” 表示 可见性:
+:public,公用的,对 所有类 可见
-:private,私有的,只对 该类本身 可用
#:protected,受保护的,对该类的 子孙 可见
不带符号:表示 default
~:package,包的,只对同一包声明的其他类可见
=:表示默认值
__(下划线):表示static
斜体:抽象 (注意也可以用两个尖括号包裹来表示抽象,比如 —— <<我是 抽象类 or 接口 >>)
如果我们定义的类是一个 抽象类(类中有纯虚函数),在画 UML 类图的时候,类名需要使用斜体显示。
如何表示类与类之间的关系?
UML中的关系是面向对象关系。

eg: 策略模式

参考资料
<<大话设计模式>>
https://refactoringguru.cn/design-patterns
https://zhuanlan.zhihu.com/p/651451595
https://www.runoob.com/design-pattern/design-pattern-intro.html
更多推荐
所有评论(0)