今天,我们来分享行为型模式的另外一个成员:状态模式。
状态模式是一种行为型模式,它允许对象在其内部状态发生变化时改变其行为。状态模式的核心思想是将对象的状态封装成一个独立的类,并将状态转移的逻辑委托给状态类来处理,从而使得对象在不同的状态下表现出不同的行为。
状态在我们的生活中无处不在。比如,听音乐的时候,我们可以选择不同的播放状态,可以是顺序播放、可以是单曲播放、也可以随机播放等;又如:线上购物后,订单从提交到完成也会有很多的状态变化,如下图所示:(当然中间可能涉及到退货等导致状态变化的,这里不展开说)。
再比如:一个TCP连接可以有Open、Acknowledge、Close等状态,一旦状态改变其行为也将发生变化。今天我们就来看一下一个状态改变后行为发生改变的模式 -- 状态模式。
意图
允许一个对象在其内部状态改变的时候改变它的行为。对象看起来似乎修改了它的类。
结构
状态模式的基本结构如下:
这里涉及到的参与者有如下几种:
Context(环境)
State(状态)
ConcreteState(具体子类)
参与者如何协作?
1、Context将与状态相关的请求委托给当前的ConreteState对象处理
2、Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。
3、Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不在需要直接与状态对象打交道。
4、Context或者ConcreteState子类都可以决定哪个状态是另外一个状态的后继者,以及是在何种条件下进行状态转换。
接下来,我们模拟监听目录查看是否有对账文件到达。
如对账文件到达,则我们开启对账处理流程,经历文件达到状态、准备数据状态、处理中状态以及完成对账状态4个阶段,不同状态下处理不同的逻辑。
我们使用状态模式来做下处理。
抽象状态接口
具体的状态(4个)
上下文环境
客户端Client
结果输出
这样,一个简单的状态模式示例就完成了。
状态模式使用场景
在以下情况下可以使用状态模式:
状态模式 vs. 策略模式
状态模式
将一群行为封装到状态类中,主类的当前状态在状态集合中游走,随着时间的流逝,主类的行为不断变化,但这对客户端而言完全是透明的,而策略模式需要客户端明确所有策略,以指明一个具体的策略。
策略模式
定义一组 算法实现,实现之间可以任意替换,而且可以在运行时动态的选择任意一种实现。 需要客户端清楚所有的策略以选择合适的策略。
如何选择?
状态模式和策略模式很相像,容易混淆,但两者意图不同。有的时候很难区分应当使用状态模式还是应当使用策略模式。一个简单的方法便是考察环境角色是否有明显的状态和状态的过渡。如果环境角色只有一个状态,那么就应当使用策略模式。而状态模式则适用于另一种情况,即环境角色有明显的状态转移。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。