概述
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。(定义)
状态模式的核心理念就是将不同状态对应的行为封装到状态中,在状态变化时改变依赖状态对象的行为。
那种在一个方法内对状态进行多重判断的方式,虽然可以根据不同的状态响应不同的结构,但不叫改变了行为方式,只是一种方法走向不同的分支。
结构
上下文类: 它定义了客户程序需要的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
抽象状态类: 定义一个接口,用以封装上下文对象中与状态相关的行为。
具体实现类: 实现抽象状态所对应的行为。
实现
对有状态的上下文对象,把与状态有关的复杂判断逻辑提取到不同的状态对象中,则在对象状态发生改变时上下文对象的行为也发生了改变。
优缺点
优点:
避免了多重判断的巨大语句块。
将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
缺点:
状态模式的使用必然会增加系统类和对象的个数。
状态模式对"开闭原则"的支持并不太好。当增加状态时需要修改上下文类。
使用场景
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。