23种设计模式 你学废了嘛 (23种设计模式)

本文目录导航:

23种设计模式,你学废了嘛?

作者王争,前 Google 工程师,本文摘自《设计模式之美》专栏23种经典设计模式分为3种类型,包括创建型、结构型和行为型。

本文将把这3种类型分为3个小模块,逐一介绍每种设计模式的原理、实现、设计意图和应用场景。

通过阅读,如果你对每种模式都有印象,说明你学得不错;如果在脑子里能形成知识架构,闭上眼睛都能回忆起来,说明你学得很好;如果能有自己的理解,并在项目开发中运用,那说明你已经掌握了精髓。

一、创建型设计模式创建型设计模式主要解决对象的创建问题,包括单例模式、工厂模式、建造者模式和原型模式。

1.单例模式单例模式用于创建全局唯一的对象,一个类只允许创建一个对象,这个类就是单例类。

尽管单例很常用,但也有人认为它是一种反模式,不推荐使用。

2.工厂模式工厂模式用来创建不同但相关的对象,由给定的参数决定创建哪种类型的对象。

当创建逻辑复杂时,使用工厂模式封装对象的创建过程。

3.建造者模式建造者模式用于创建复杂对象,可以通过设置不同的参数创建不同的对象。

4.原型模式原型模式利用已有对象复制的方式创建新对象,节省创建时间。

二、结构型设计模式结构型模式主要解决类或对象组合的经典结构,包括代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式。

1.代理模式代理模式为原始类定义一个代理类,主要目的是控制访问。

静态代理需要为每个类创建一个代理类,增加了维护成本。

2.桥接模式桥接模式将抽象和实现解耦,让它们能独立开发。

3.装饰器模式装饰器模式通过组合来替代继承,给原始类添加增强功能。

4.适配器模式适配器模式将不兼容的接口转换为可兼容的接口,让原本不能一起工作的类可以一起工作。

5.门面模式门面模式通过封装细粒度接口,提供组合接口,提高接口的易用性。

6.组合模式组合模式将一组对象组织成树形结构,将单个对象和组合对象都看作树中的节点。

7.享元模式享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。

三、行为型设计模式行为型模式主要解决类或对象之间的交互问题,包括观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。

1.观察者模式观察者模式将观察者和被观察者代码解耦,应用场景广泛。

2.模板模式模板方法模式在一个方法中定义一个算法骨架,将某些步骤推迟到子类中实现。

3.策略模式策略模式定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。

4.职责链模式职责链模式中,多个处理器依次处理同一个请求。

5.迭代器模式迭代器模式用来遍历集合对象,解耦容器代码和遍历代码。

6.状态模式状态模式一般用来实现状态机,常用在游戏、工作流引擎等系统开发中。

7.访问者模式访问者模式允许一个或多个操作应用到一组对象上,设计意图是解耦操作和对象本身。

8.备忘录模式备忘录模式也叫快照模式,在对象之外保存对象的状态,以便之后恢复对象为先前的状态。

9.命令模式命令模式将函数封装成对象,实现把函数像对象一样使用。

10.解释器模式解释器模式为某个语言定义它的语法表示,并定义一个解释器用来处理这个语法。

11.中介模式中介模式通过引入中介这个中间层,将一组对象之间的交互关系从多对多(网状关系)转换为一对多(星状关系)。

23种设计模式 你学废了嘛 (23种设计模式)

JAVA+项目流程中状态多,如何设计便于维护?

在Java项目流程中,状态多确实会增加项目的维护难度。为了便于维护,可以考虑以下设计方案:

综上所述,设计Java项目时需要考虑到状态多的情况,通过统一状态管理、使用状态机模式、使用设计模式、划分模块、统一命名规范等方案来处理多状态的问题,可以降低维护难度,提高代码质量。

(有限)状态机

状态机是最基本的设计模式。

而我们常常说的状态机指有限状态机,缩写是FSM(Finite State Machine)。

无限状态机仅仅是理论上存在的概念,比如,把1/3变成一个状态机的话,那这个状态就是无限循环了,实际上没啥实际的应用意义。

我们常说的状态机指有限状态机。

不夸张的说,状态机模型是世界运行的基础,大脑做的决策推演,在火星上运行的祝融号,计算机软件的底层设计,游戏中的沙雕AI,其底层逻辑都是状态机。

有限状态机的定义: 有限个状态 及在这些状态之间的转移和动作等行为的数学模型;在计算机科学中,状态机的关键要素是状态和状态的转移。

按照输入输出关系,状态机模型有2个,分别是Moore模型(发明者:Edward Moore 1956)和Mealy模型(发明者:George H. Mealy 1955),看到这俩名字,莫名的就想到了《Rick and Morty》...

这两个模型的特点可以用如下公式概括:

一句话:

Moore的设计仅仅与状态有关,Mealy的设计与状态和输入有关系。

Mealy的状态比Moore的状态要少。

它们的设计和表示方法如下所示:

moore和mealy本质上并没有什么差别,设计上可以互相转化。

上图中的A Mealy 转为 Morre 如下所示:

上图中的B Moore 转为 Mealy 如下所示:

推导过程可以参考:回到程序设计的话题,要设计一个通用的状态机程序,只用switch,case肯定是不够的;

当然,不管是用哪种语言,只要把握住状态机的三个核心要素即可,即:

画成一张图如下(手动 @陈振):

把它转换成一个数据结构,即:

通用的设计思路是把所有的状态和状态转换表达成一个表,通过查表的形式驱动状态机运转起来。

状态转移表,示例是一个输入4个数字密码(9527)的状态转移表:

状态机的查询和运转:

运行结果展示:

在python里面有一个transitions状态机库,感兴趣的同学可以自己学习一把。

运行结果:

掌握了核心思想,设计一个状态机的通用程序并不是很复杂的事情。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

85阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

85阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

77阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读