在阿里巴巴的Java开发设计手册中提到
推荐尽量少用else,if-else的方式可以改写成:
if(condition){
...
return obj;
}//接着写else的业务逻辑代码。
说明:如果非得使用if()...else if()...else...方式表达逻辑,请勿超过3层。超过请使用状态设计模式。
正例:逻辑上超过3层的if-else代码可以使用卫语句,或者状态模式来实现。
今天我们就来了解了解状态模式
状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到不同状态的一系列类当中,可以把复杂的判断逻辑简化。
状态模式是将一群行为封装在状态对象中,context的行为随时可以委托到那些状态对象中的一个,随着时间的流逝,当前状态在状态对象集合中游走改变。但context的客户对于状态对象了解不多,甚至浑然不觉。
1.设计要点
(1)在实现状态模式的时候,实现的场景状态有时候会非常复杂,决定状态变化的因素也非常多,我们可以把决定状态变化的属性单独抽象成一个类 StateInfo,这样判断状态属性是否符合当前的状态isMatch时就可以传入更多的信息。
(2)每一种状态应当只有唯一的实例。
2.状态模式的优缺点
优点:
(1)封装了状态的转换规则,在状态模式中可以将状态的转换代码封装在环境类中,对状态转换代码进行集中管理,而不是分散在一个个业务逻辑中。
(2)将所有与某个状态有关的行为放到一个类中(称为状态类),使开发人员只专注于该状态下的逻辑开发。
(3)允许状态转换逻辑与状态对象合为一体,使用时只需要注入一个不同的状态对象即可使环境对象拥有不同的行为。
缺点:
(1)会增加系统类和对象的个数。
(2)状态模式的结构与实现都较为复杂,如果使用不当容易导致程序结构和代码的混乱。
3.要点
(1).状态模式允许一个对象基于内部状态而拥有不同的行为。
(2).状态模式用类代表状态
(3).Context会将行为委托给当前状态对象
(4).通过将每一个状态封装进一个类,我们把以后需要做的任何改变局部化了。
(5).状态模式允许Context随着状态的改变而改变行为。
(6).状态转换可以由State类或Context类控制。
(7).使用状态模式通常会导致设计类的数目大量增加。
(8).状态类可以被多个Comtext实例共享。