设计模式入门

前言

适合阅读本专栏的人群包括:

  • 想提升代码质量和架构思维的 Java 开发者
  • 在工作中面对复杂业务、代码难以维护的工程师
  • 想准备面试、系统复习设计模式知识的同学

阅读完本专栏,你将掌握:

  • 23 种设计模式的结构、适用场景和最佳实践
  • 面向对象六大设计原则的使用方式
  • 如何用设计模式解决常见业务场景问题
  • 如何重构低质量代码,提升扩展性与可维护性

任何问题都可以在留言区指出,作者看到后会第一时间回复。

概念总是生僻的,可以结合代码多体会多练习。
本系列文章会以每周最少3篇的速度持续更新。
如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。

为什么要学习设计模式?

很多人将编程能力比作武术修为,将 设计模式 比作是武术中的内功。修过仙的同学们应该都知道,没有内功的招式都是假把式。
我在参加工作的前两年经历了三个也算比较大型的项目,其中几乎很少用到设计模式,工作中更多的是直白的CRUD,所以对设计模式不重视也没有特意学过这部分内容。但是在我换了东家后的一个项目中,我几乎能在核心代码中看到全部设计模式的应用。这些设计模式在我之后对项目开发维护中带来了许多便利,也让我切身体会到设计模式的伟大。
很多言论认为使用设计模式会使代码难以阅读,对于新手是不友好的,同时还可能会导致过度设计。
其实大家都是从不懂到懂一点点过来的,永远不要畏难,因害怕过度设计而不用设计模式显然是因噎废食。
如果有小伙伴在代码中使用了设计模式我会夸一句:优雅!

什么是设计模式?

1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。
设计模式是软件开发中常见问题的通用解决方案。它们是被反复应用的经验总结,提供了在特定环境下解决特定问题的模板。设计模式并不是具体的代码,而是一种思考问题和解决问题的方式,可以帮助开发者以更高效、可维护和可复用的方式编写软件。
我在笔记中使用 Java 作为编程语言,但是设计模式并不是 Java 的专利,它同样适用于 C++,C#,JavaScript 等其它面向对象的编程语言。
我们常说的设计模式一般指23种,但现在的设计模式已经远远不止23种。

设计模式的分类

  1. 创建型模式(Creational):关注对象的实例化过程,包括了如何实例化对象、隐藏对象的创建细节等。常见的创建型模式有单例模式、工厂模式、抽象工厂模式等。
  2. 结构型模式(Structural):关注对象之间的组合方式,以达到构建更大结构的目标。这些模式帮助你定义对象之间的关系,从而实现更大的结构。常见的结构型模式有适配器模式、装饰器模式、代理模式等。
  3. 行为型模式(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

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐