状态模式 - State
背景
状态模式基于有限状态机(FSM finite state machine)的概念,主要思想是程序在任意时刻一定处于 N 种有限数量的状态中,并且在特定状态中执行特定状态的操作并可以流转至下一状态(也可不变)
这些数量有限且预先定义的状态切换规则被称为 状态流转
目的 将状态以及状态行为等属性和业务对象解耦,是一种基于组合模式进行逻辑委托的行为模式
现实世界类比 地铁电动闸门会根据当前状态和用户行为进行不同的操作并且流转为下一状态:
状态模式基于有限状态机(FSM finite state machine)的概念,主要思想是程序在任意时刻一定处于 N 种有限数量的状态中,并且在特定状态中执行特定状态的操作并可以流转至下一状态(也可不变)
这些数量有限且预先定义的状态切换规则被称为 状态流转
目的 将状态以及状态行为等属性和业务对象解耦,是一种基于组合模式进行逻辑委托的行为模式
现实世界类比 地铁电动闸门会根据当前状态和用户行为进行不同的操作并且流转为下一状态:
突然发现 Hexo 中的有些文章突然打不开了
表现是点击无反应,无论是点击 “阅读原文” 还是在归档等页面中点击文章标题都无法正常打开
查看控制台发现对页面的请求 404 了
基于 SpringBoot 的实现方式自然使用到了 starter 机制,核心代码在
liteflow-spring-boot-starter
包下
首先来看 spring.factories
文件
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
可以看到一共有两个重要的自动装配的配置类:
ConcurrentLinkedHashMap 构造方法私有,只能通过其静态内部类
Builder
来进行实例化
一个完全支持并发检索的哈希表,可调节更新预期并发度,以及限制其最大容量
该实现与
ConcurrentHashMap
的不同之处在于维护了一个页面替换算法(page replacement algorithm),用于在 map 超出容量时删除元素这个 map 实现没有共有的构造器,它的实例是通过
Builder
创建的
Builder
支持链式赋值,使用如下
Maison Premiere’s Tom Collins Cocktail Recipe | PUNCH (punchdrink.com)
对于某些调酒师来说,“被低估” 并不一定意味着鲜为人知
Maison Premiere 的威廉·埃利奥特(William Elliott)认为,汤姆柯林斯是无处不在的经典,值得 ”好好对待“
空对象模式(Null Object Pattern),使用空对象的行为(空实现、校验等)来代替对 Null 值的判断;空对象并不是在检查空值,而是通过对象的行为实现不进行任何动作或者校验的效果,以此对调用方隐藏更多的实现细节
目的 向上层隐藏更多的实现细节,加强系统的稳定性,减少判空判断
现实世界类比 在现实世界中也很难表达 ”空“
这个概念,往往会使用 ”空盒子“、”空间“
来进行表达,类比在代码中就是使用表现空概念的对象,而不是判空
obj == null
来实现对空的判断