C++设计模式(2):状态模式

一、状态和有状态的对象

一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的对象;这样的对象状态是从事先定义好的一系列值中取出来的,当一个这样的对象与外部事件产生互动,其内部状态就会改变,从而使得系统的行为与随之发生变化。

二、状态模式

状态模式:又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式;允许一个对象
         在其内部状态改变的时候改变自己的行为,对象看起来似乎修改了自己的类。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
如果不使用状态模式,那么就需要适用很多if-else来根据当前状态做出适当的行为选择,码中包含大量与对象状态有关的条件语句,并且不利于后续增加状态的扩展,不可取。

三、模式角色和模式类图

用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

state状态:表示状态,定义了根据不同状态进行不同处理的接口,该接口是那些处理内容依赖于状态的方法集合,对应实例的state类
具体的状态:实现了state接口,对应具体的状态类
context:context持有当前状态的具体状态的实例,此外,他还定义了供外部调用者使用的状态模式的接口。
在这里插入图片描述
题例:万能糖果公司
我们认为糖果机的控制器需要如下图般的工作,希望你能用C++语言帮我们实现它,而且需要让设计能够尽量有弹性而且好维护,因为将来我们可能要为它增加更多的行为。
在这里插入图片描述
这张图是一个状态图,糖果机的所有状态有:“没有25分钱”,“有25分钱”,“糖果售罄”,“售出糖果”,每一个状态都代表机器不同的配置,需要某些动作将目前的状态转换到另外一个状态,要进入另外一种状态,必须做某些事情。对于糖果机当前任何一个动作,我们都需要检查,看看糖果机所处的状态和动作是否合适。

下面我们按照一般思维来设计糖果机的这些功能,步骤如下:
(1)找出所有的状态
没有25分钱”、“有25分钱”、“糖果售罄”、“售出糖果
(2)创建一个实例变量来持有目前的状态,然后定义每个状态的值

const static int NO_QUARTER = 1;
const static int HAS_QUARTER = 2;
const static int SOLD_OUT = 0;
const static int SOLD = 3;
int state = SOLD_OUT;

3)将所有糖果机系统中可以发生的动作整合起来
根据状态图可知,四个状态对应着四个动作:“投入25分钱”,“退回25分钱”,“转动曲柄”,“发放糖果”;
这些动作是糖果机的对客户的接口,糖果机会以机器按钮的方式让这些接口与玩家交互,这是你能对糖果机做的事情,调用任何一个动作都会造成状态的转换,发放糖果更多是糖果机的内部动作,机器自己调用自己。
(4)现在,我们创建了一个类,它的作用就像是一个状态机,对每一个动作,我们都创建了一个对应的方法,这些方法利用条件语句来决定在每个状态内什么行为是恰当的。每一个可能的状态都需要用条件语句检查,然后对每一个可能的状态展现适当的行为。

#include<iostream&g
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值