2007-09-19

利用ColdFusion组件实现状态模式

来源: 开发者 作者: 评论 0 条
 
</cffunction>

</cfcomponent>

列表G


<h2>Now, using the State pattern:</h2>
<cfset draftState = createObject('component','DraftState').init() />
<cfset reviewState = createObject('component','ReviewState').init() />
<cfset approvePublishState = createObject('component','ApprovePublishState').init() />
<cfset publishedState = createObject('component','PublishedState').init() />
States created...<br/>
<hr/>

<cfset content = createObject('component','ContentItemContext').init(draftState,reviewState,approvePublishState,publishedState,'draft') />
Context created in <strong>draft</strong>...<br/>
<cfset content.save() />
<cfset content.approve() />
<cfset content.approve() />
<cfset content.approve() />
<cfset content.save() />
<cfset content.approve() />
<cfset content.reject() />

<hr/>
<cfset content2 = createObject('component','ContentItemContext').init(draftState,reviewState,approvePublishState,publishedState,'review') />
Context created in <strong>review</strong>...<br/>
<cfset content2.reject() />
<cfset content2.save() />
<cfset content2.approve() />
<cfset content2.approve() />
<cfset content2.reject() />

ContentItemContext所做的是,当调用方法时将每个状态的参数“this”传递给自身。通过这种方式,状态CFC可以执行它的行为,然后指示ContentItemContext进入下个状态。

假如需要添加状态,我们只要创建一个新的状态对象,然后添加部分代码让ContentItemContext知道新添加的状态。所有将来添加的状态的行为被封装起来,尽量避免改变已经存在的代码。

当然,绝大多数情况下,每个状态是一个单独对象,也就是说它们不包含实例数据,且它们只需要创建一次。可能我们需要大量ContentItemContext CFCs(每个内容项对应一个),但是均可用同样一个实例。这就减少了我们需要创建的CFCs数量。虽然并不是总是如此,但也时有发生。

为了展示状态模式,为大家附加一个UML图,如下表A。对于熟悉模式的人,可能会注重到对象之间的关系与策略模式和桥模式类似。虽然它们间的关系类似,但是每种模式的用途不同。

表 A

利用ColdFusion组件实现状态模式

状态模式UML图

值得一试

本文向大家展示了如何利用状态模式解决CFC中的方法或条件爆炸问题。虽然模式的应用可能会给系统带来另外的复杂性,但是对它所带来的优点来说这还是值得的。


共9页: 上一页 [1] [2] [3] [4] [5] [6] [7] [8] 9 下一页
(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:Python介绍  
下一篇:Java语言中常见的十大误解
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号