预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共31页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第24章 状态模式 主讲教师:程细柱韶关学院计算机系 本书主编:刘伟清华大学出版社 本章教学内容 状态模式 9模式动机与定义 9模式结构与分析 9模式实例与解析 9模式效果与应用 9模式扩展 状态模式 模式动机 9在很多情况下,一个对象的行为取决于一个或多个动态 变化的属性,这样的属性叫做状态,这样的对象叫做有 状态的(stateful)对象,这样的对象状态是从事先定义 好的一系列值中取出的。当一个这样的对象与外部事件 产生互动时,其内部状态就会改变,从而使得系统的行 为也随之发生变化。 9在UML中可以使用状态图来描述对象状态的变化。 状态模式 模式动机 开心失恋伤心 do/唱歌do/撞墙 do/请客吃饭中奖do/疯狂购物 状态模式 模式定义 9状态模式(StatePattern):允许一个对象在其 内部状态改变时改变它的行为,对象看起来似 乎修改了它的类。其别名为状态对象(Objects forStates),状态模式是一种对象行为型模式。 状态模式 模式定义 9StatePattern:Allowanobjecttoalterits behaviorwhenitsinternalstatechanges.The objectwillappeartochangeitsclass. 9Frequencyofuse:medium 状态模式 模式结构 状态模式 模式结构 9状态模式包含如下角色: •Context:环境类 •State:抽象状态类 •ConcreteState:具体状态类 状态模式 模式分析 9状态模式描述了对象状态的变化以及对象如何 在每一种状态下表现出不同的行为。 9状态模式的关键是引入了一个抽象类来专门表 示对象的状态,这个类我们叫做抽象状态类, 而对象的每一种具体状态类都继承了该类,并 在不同具体状态类中实现了不同状态的行为, 包括各种状态之间的转换。 状态模式 模式分析 状态模式Š模式分析 …… if(state=="空闲"){ if(预订房间) 不使用状态模式{预订操作;state="已预订";} elseif(住进房间) {入住操作;state="已入住";} } elseif(state=="已预订") { if(住进房间) {入住操作;state="已入住";} elseif(取消预订) {取消操作;state="空闲";} } …… 状态模式 模式分析 状态模式 模式分析 9使用状态模式重构之后的代码: //重构之后的“空闲状态类”示例代码 …… if(预订房间) {预订操作;context.setState(new已预订状态类());} elseif(住进房间) {入住操作;context.setState(new已入住状态类());} …… 状态模式 模式分析 9在状态模式结构中需要理解环境类与抽象状态类的作用: •环境类实际上就是拥有状态的对象,环境类有时候可以充当状态管 理器(StateManager)的角色,可以在环境类中对状态进行切换操作。 •抽象状态类可以是抽象类,也可以是接口,不同状态类就是继承这 个父类的不同子类,状态类的产生是由于环境类存在多个状态,同 时还满足两个条件:这些状态经常需要切换,在不同的状态下对象 的行为不同。 •将不同对象下的行为单独提取出来封装在具体的状态类中,使得环 境类对象在其内部状态改变时可以改变它的行为,对象看起来似乎 修改了它的类,而实际上是由于切换到不同的具体状态类实现的。 状态模式 状态模式实例与解析 9实例一:论坛用户等级 •在某论坛系统中,用户发表留言、回复留言增加积分; 用户下载文件将扣除积分。该系统用户分为三个等级, 这三个等级对应如下三种不同的状态: y(1)如果积分小于100分,则为新手状态,用户可以发表 留言、回复留言,但是不能下载文件。 y(2)如果积分大于等于100分但小于1000分,则为高手状 态,用户可以发表留言、回复留言,还可以下载文件, 而且用户在发表留言时可以获取双倍积分。如果下载文 件后积分小于0,则不能下载该文件。 y(3)如果积分大于等于1000分,则为专家状态,用户可以 发表留言、回复留言和下载文件,用户除了在发表留言 时可以获取双倍积分外,下载文件只扣除所需积分的一 半。如果下载文件后积分小于0,则不能下载该文件。 Š状态模式实例与解析 状态模式9实例一:论坛用户等级 状态模式 状态模式实例与解析 9实例一:论坛用户等级 •参考代码:Chapter24State\sample01 •下载地址:http://download.csdn.net/user/cflynn 演示…… 状态模式 状态模式实例与解析 9实例二:银行账户 •在某银行系统定