找回密码
 FreeOZ用户注册
查看: 1776|回复: 8
打印 上一主题 下一主题

[论坛技术] Design Pattern的思考:状态模式

[复制链接]
跳转到指定楼层
1#
发表于 7-5-2009 22:43:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
直觉上说,状态Design Pattern并不难理解。GoF的书举的是TCP连接状态的例子。
我觉得这本书并没有把状态模式说得很清楚。本文的目的就是想把这相设计模式按照
我的理解,进一步说明一下。

首先,既然是状态模式,最先有的自然是状态。通过分析GoF的程序,我画到了下面
的一个简化的状态图。

评分

参与人数 3威望 +70 收起 理由
ubuntuhk + 30 好文,谢谢分享!
procoder + 20 谢谢分享!
hoopoos + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

2#
发表于 7-5-2009 23:08:15 | 只看该作者
回复  

使用道具 举报

3#
 楼主| 发表于 7-5-2009 23:53:16 | 只看该作者


这个是真正的有限状态机。如果我没有估计错(很可能估计错,哈哈),是需要程序需把有限状态机画好,编好码,然后在弄进去。
纯粹的有限状态机是一个数据结构和算法问题。我想,状态模式的着眼点并不是这样一个有点接近数学问题的处理上,而是一个更为
程序员熟悉和接受的状态转变问题上。

不知道我说得对不对,没有认真看core同学给出的url
回复  

使用道具 举报

4#
发表于 8-5-2009 00:19:20 | 只看该作者

回复 #3 key 的帖子

对,就是有限状态机,类似的还有Boost.Statechart , 其实和状态模式是一回事,就是个状态转换器,重型的switch,游戏编程中就会经常用到这个模式。上面那个TCP状态转换的例子,最经典的表达就是用有限状态机,所谓状态模式只是把有限状态机这个概念用不严格的定义简化表达了一下。
回复  

使用道具 举报

5#
 楼主| 发表于 8-5-2009 01:40:00 | 只看该作者
原帖由 coredump 于 8-5-2009 00:19 发表
对,就是有限状态机,类似的还有Boost.Statechart , 其实和状态模式是一回事,就是个状态转换器,重型的switch,游戏编程中就会经常用到这个模式。上面那个TCP状态转换的例子,最经典的表达就是用有限状态机,所谓状 ...


我倒是喜欢这个“不严格”的模式。真正的有限状态机太数学,太严肃了,你看有多少人愿意把MIT的ALG那本书看完?反正我自己就不愿意,哈哈哈
回复  

使用道具 举报

6#
发表于 8-5-2009 09:40:12 | 只看该作者
我们的一个以Swing为Client的产品,曾经广泛应用State模式,具体来说就是每个菜单对应的Task,是一组wizard panel,每个panel都有next ,back,cancel,finish这些button,相对应的就是状态的转换。
回复  

使用道具 举报

7#
发表于 8-5-2009 12:13:24 | 只看该作者
对于类似上面的应用,我会用map应对switch,map是从配置文件配置的,当然第一层switch还是用state pattern,因为不同的state,map不一样的。
回复  

使用道具 举报

8#
发表于 8-5-2009 14:25:37 | 只看该作者
我们的状态类,是通过UML的activitity diagram经过正向工程generate的code。
回复  

使用道具 举报

9#
 楼主| 发表于 8-5-2009 16:50:19 | 只看该作者
原帖由 procoder 于 8-5-2009 12:13 发表
对于类似上面的应用,我会用map应对switch,map是从配置文件配置的,当然第一层switch还是用state pattern,因为不同的state,map不一样的。


map/switch方案和state模式是两个不同方向的实现。
从目前来说,支持map方案的我觉得会占大多数,因为configurable很重要。
再加上state模式带来的子类过多问题,的确很头痛。

从实现方案而言,我也支持configurable的map方案,甚至可以基于SAX通过XML来驱动。
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 21-4-2025 17:52 , Processed in 0.018721 second(s), 28 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表