Java设计模式 之 行为模式-状态模式&策略模式
一、模式定义
1、策略模式:
1)Strategy:定义所有支持的算法的公共接口抽象类
2)ConcreteStrategy:封装了具体的算法或行为,继承于Strategy
3)Context:用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用

2、状态模式:
1)State:抽象状态类,定义一个接口封装与Context的一个状态相关的行为
2)ConcreteState:具体状态,每一子类实现一个与Context的一个状态相关的行为
3)Context:维护一个ConcreteState子类的实例,这个实例定义当前的状态

二、策略模式&状态模式
1、模式思想
1)状态模式:状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行。
2)策略模式:考虑多种不同的业务规则将不同的算法封装起来,便于调用者选择调用,策略模式只是条件选择执行一次。
2、共同点:
1)都是把不同的情形抽象为统一的接口来实现,就放在一起进行记录2个模式的UML建模基本相似,符合开闭原则
3、不同点:
1)状态模式需要在子类实现与Context相关的一个状态行为,保证此状态结束后可以执行到下一个状态。
2)策略模式是一个接口的应用案例,用于单个算法的替换,客户端事先必须知道所有的可替换策略,由客户端去指定需要哪个策略,
通常都只有一个最恰当的策略被选择。其他策略都是同级的,可互相动态在运行中替换原有策略;状态模式每个状态子类中需要包含
环境类(Context)中的所有方法的具体实现。通过把行为和行为对应的逻辑包装到状态类里,在环境类里消除大量的逻辑判断,而
不同状态的切换由继承State的状态子类实现,当发现修改的当前对象的状态不是自己这个状态所对应的参数,则各个状态子类给Context
类切换状态(有职责链模式思想),客户端不直接和状态类交互,客户端不需要谅解状态(和策略模式不一样),策略模式是直接注入
到Context类的参数选择策略,不存在切换状态的操作。
4、优缺点:
状态模式优点:
1)代码中冗长的逻辑判断得到解决,减少代码中if else,方便维护
2)将具体的状态和对应的行为及逻辑封装起来,每个状态类都符合开闭原则,可以随时增加新的状态或者删除
状态模式缺点:
1)使用状态模式时,每个状态对应一个具体的状态类,结构分散,当状态类比较多时,关闭比较负责;
策略模式优点:
1)代码中冗长的逻辑判断得到解决,减少代码中if else,方便维护
2)实现的Strategy可以提供相同行为的不同实现,客户端可根据不同条件选择不同的策略实现。
策略模式缺点:
1)客户端必须知道所有的策略类,并自行决定使用哪个策略类,因此必须向客户端暴露具体实现问题
5、使用场景
1)状态模式:主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列
类中,可以把复杂的判断逻辑简化。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑
使用状态模式。
2)策略模式:Strategy类层次为Context定义了一系列的可供重用的算法或行为。只要在分析过程中需要在不同条件使用不同业务规则,
就可以考虑使用策略模式。

浙公网安备 33010602011771号