自我联想学设计模式(初级版)-2-状态模式

状态模式顾名思义就是一个对象有多个状态,这里以谈恋爱为例。

首先我们搞清楚为什么要使用状态模式,其实很简单,就是减轻心智负担,因为一个对象它的状态不同,对于同一种事情的反应也不同,如果你女朋友心情好,那么你要求什么她也会答应,如果她心情差,那么你同样的要求就会有各种各样的回应。

假设她平时有3个状态,你都熟悉的不得了,但是如果她看了更多书,有了新的认识,突然发展处了另外2个状态。

那么你怎么处理和她的关系呢?

如果她又发展出了另外5个呢?

想想都恐怖。

所以此时,如果你能把她之前的状态的处理都分类打包好,分配给多个人,让这些人一一面对她的各个状态,是不是你自己就会轻松多呢?

这个例子虽然不合适,大概意思就是这样。

那如果我们看过重构这方面的书的话,这个if else或者switch case就是一个非常明显的信号,需要我们重构。

因为过多的if else 会消耗我们的心智,让我们陷入一种混乱的状态。

这就好比原来是特朗普除了各个国家和美国的外交,但特朗普觉得太累了,于是他说,你A你去对付中国,B你去对付俄罗斯,C你去对付法国。特朗普自己可以去调度谁去应付谁,也可以提前就给这些人安排好任务,让这些人自己去处理。

这里的你和特朗普,本来都是有一大堆switch case和if else要处理的。

现在不同了,现在你和特朗普什么都不需要做了,让另外一个人去做,这个人就是状态类。

状态模式没什么太大的难度。

有几个要点。

1.可以先创建好所需State对象并且始终不销毁它们,也可以仅当需要它们时才创建

什么时候先创建呢?当状态改变很频繁时,避免反复创建和销毁的开销。

什么时候需要时才创建呢?当要进入的状态在运行时不可知,并且上下文不经常改变状态时。

1.谁定义状态转换?

可以由Context(你或川普)来控制状态的转换,也可以由State子类指定它们的身后状态。

什么时候由Context控制呢?如果该转换的准则是固定的,那么它们可在Context中完全实现。

何时由State子类控制呢?当让State子类自身指定它们的后继状态以及何时进行转换,通常更灵活更合适。

这需要Context增加一个接口,让State对象显示设定Context当前状态。

这样做的一个缺点是,一个State子类至少拥有一个其他子类的消息,这就在各子类之间产生了实现依赖。

 

通常的做法是定义一个状态基类,或状态接口,按照Context的不同需求,设置接口。

然后子类都实现这些接口,只是实现的函数里各自的处理不同。

如果函数太多都没什么用途,可以采用。最简单的Start和End两个统一接口。

在Start函数中做出该状态启动时需要做的动作,

在End函数中做出该状态关闭时需要做的动作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值