状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。(DP)
当我们的代码中有这样的表达时,是不好的。
因为 Long Method 可能是坏味道。
方法过长,且有很多的判断分支,就意味着它的责任过大了。无论是任何状态,都需要它改变,这实际上是很糟糕的。
上UML图
状态行为的好处就是,将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将各种状态逻辑分割到子类之间,减少互相的依赖。
py-pattern 项目里面关于状态模式的例子不可谓不经典。
例子是这样的,有一个收音机,可以调到AM或者FM的状态。并且每个状态都有相同的方法,就是在特定频段间扫描。
不同的是,AM和FM扫描的频段是不同的。
于是有一个状态基类和他的两个子类AM和FM,他们都有的方法在基类中,不同的在子类中。
改变他们状态,就直接改变了实现。
以下是输出:
这个例子棒极了。
于是我马上在我的代码中实现了一个。
需求是这样,前端有个选项,是判断是找所有的信息,或者是单个类别的信息。这两者的区别主要就在数据库查询语句的差别。
按照原来的实现,我至少有四个地方需要用到判断。于是我改成了状态模式。
上代码
只留下了代码骨架。
大量的mongo 聚合的pipeline都留到了子类里面,只要专注于定定不同的子类就可以了。即使下次做修改也十分便利。