python 设计模式之状态模式

1.为何会出现状态模式?

在软件开发过程当中,各类应用程序可能会根据不一样的状况作出不一样的处理。最直接的方案就是把全部的可能发生的状况都考虑到。而后使用条件语句(if...elseif...elseif......else)对不一样状况的做出判断并进行处理。可是假如状态比较复杂,就会出现多个判断语句,判断语句中又包含这各类操做,这显然是不受欢迎的。状态模式的出现就是为了解决这种问题。html

 

2.啥是状态模式?

状态模式用于解决系统中复杂对象的状态转换以及不一样状态下行为的封装问题,将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态能够灵活变化。spa

状态模式:容许一个对象在其内部状态改变时改变它的行为,即不一样的状态对应了不一样的行为。对象看起来彷佛修改了它的类。不少状况下,一个对象的行为取决于一个或者多个动态变化的属性。这样的属性叫作状态,这样的对象叫作有状态的对象。其状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之改变。设计

归纳以下:3d

1、状态模式的优势是结构清晰,相比于if…else…简约了很多;
二、封装性好,外部调用没必要知道内部实现细节。
code

 

 

3.状态模式的优势?

状态模式的好处是将与特定状态相关的行为局部化,而且将不一样状态的行为分割开来。[DP]就是将特定的状态相关的行为都放入一个对象中,因为全部与状态相关的代码都存在于某个ConcretState中,因此经过定义新的子类能够很容易的增长新的状态和转换[DP]。这样作的目的就是为了消除庞大的条件分支语句,大的分支判断会使得它们难以修改和扩展。状态模式经过把各类状态转移逻辑分不到State的子类之间,来减小相互之间的依赖。htm

 

 4.状态模式应用场景

何时须要考虑使用状态模式呢?当一个对象的行为取决于它的状态,而且它必须在运行时刻根据状态改变它的行为,就可使用状态模式。另外,若是业务需求某项业务有多个状态,一般都是一些枚举常量,状态的变化都是依靠大量的分支判断语句来实现,此时应该考虑将每一种业务状态定义为一个State子类,这样这些对象就能够不依赖于其余对象而独立变化了,若是某天客户需求改了,增长或减小业务状态或改变状态流程,都不是困难了。对象

归纳以下:blog

行为状态改变的场景。这点在各类控制器中很是常见,同时,逻辑结构为状态转移图的场景中都很是适用。事件

 好比电梯楼层停/开门/走控制了,好比糖果机器投币卖糖果了,好比自动开关门了,等等。开发

 

5.状态模式的缺点?

在状态比较多时,子类也会很是多,不便于管理。

 

 6.举个栗子(不用状态模式和用状态模式对比)

 

 1)不用状态模式的时候

 

 

这个类中的flow方法过长,并且有不少判断分支,意味着它的责任过大了。面向对象设计其实就是但愿作到代码的责任分解。因此这个类违背了单一职责原则

此外,flow方法里有这么多判断,使得任何需求的改动或增长,都须要去更改这个方法。因此这个类也违背了开放-封闭原则

 

 

 2)用状态模式的时候

 

 

3)增长条件了

假设老板说今天版本要上线,要球22:00到24:00过来加班,

修改对好比下

 

 

参考

https://www.cnblogs.com/welan/p/9130283.html

https://www.cnblogs.com/CheeseZH/p/9458703.html

https://www.cnblogs.com/liuqingzheng/articles/10039743.html