摘要:以降低復(fù)雜度,增強(qiáng)可擴(kuò)張性為目標(biāo),建立基于傳送裝置的入口模型,體現(xiàn)出狀態(tài)模式的優(yōu)越性,最終通過采用該模式解決了某大型鋼鐵企業(yè)傳送裝置入口的建模問題。
關(guān)鍵詞:設(shè)計(jì)模式;狀態(tài)模式;軟件復(fù)用
文獻(xiàn)標(biāo)識碼:A 中圖分類號:TP311 文章編號:1009-3044(2009)15-3919-02
Application Research and Analysis Based on the State Pattern
HE Jian1, XIAO Zhuo-yu2
(1.The Maternal and Child Health Hospital of Hunan Province, ChangSha 410008, China; 2.New College of Central South University of Forestry and Technology, Changsha 410004, China)
Abstract: This paper sets up a model base on entrance of the equipment get increase expanding, cut down the complexity early or late. At the same time get the advantage of the State Pattern .Finally we settle the entrance of the equipment modeling problem by state pattern.
Key words: design pattern; state pattern; reusable software
1 引言
設(shè)計(jì)面向?qū)ο蟮能浖容^困難,而設(shè)計(jì)可復(fù)用面向?qū)ο蟮能浖透永щy。你必須找到相關(guān)的對象,以適當(dāng)?shù)牧6葘⑺麄儦w類,再定義類的接口和繼承層次,建立對象之間的基本關(guān)系,為此提出設(shè)計(jì)模式這個(gè)概念[1]。設(shè)計(jì)模式簡化了軟件的設(shè)計(jì)和過程的實(shí)現(xiàn),使軟件系統(tǒng)的基礎(chǔ)架構(gòu)更加清晰,因此在諸多大型軟件系統(tǒng)的設(shè)計(jì)過程中,設(shè)計(jì)模式都成為重要的輔助手段。文章以某大型鋼鐵企業(yè)熱匝薄板管理系統(tǒng)的傳送裝置的入口為背景,比較了兩種設(shè)計(jì)模式(第一種設(shè)計(jì)模式是該鋼鐵企業(yè)在90年代初實(shí)施863計(jì)劃信息化帶動工業(yè)化所用的老CIMS系統(tǒng),第二種模式是我方基于狀態(tài)模式開發(fā)的新系統(tǒng)),并通過研究比較,體現(xiàn)出以降低復(fù)雜度,增強(qiáng)可擴(kuò)張性為目的的狀態(tài)模式在處理旋轉(zhuǎn)傳送裝置入口問題的優(yōu)越性。
2 設(shè)計(jì)模式
設(shè)計(jì)模式首先由Erich Gamma, Richard Helm等幾位模式設(shè)計(jì)先行者引入到軟件設(shè)計(jì)領(lǐng)域。一個(gè)設(shè)計(jì)模式的命名,抽象確定了一個(gè)通用設(shè)計(jì)結(jié)構(gòu)的主要方面,這些設(shè)計(jì)結(jié)構(gòu)能被用來構(gòu)造可復(fù)用的面向?qū)ο笤O(shè)計(jì)[2-3],并且每一個(gè)設(shè)計(jì)模式都集中在一個(gè)面向?qū)ο蟮脑O(shè)計(jì)問題或設(shè)計(jì)要點(diǎn)。
3 狀態(tài)模式(State Pattern)模型
狀態(tài)模式的用意是允許一個(gè)對象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為[3]。如圖1所示,我們考慮一個(gè)Context類,Context對象處于若干不同狀態(tài)之一如:ConcreteStateA, ConcreteStateB等, 當(dāng)一個(gè)Context對象收到其他對象請求后,它根據(jù)自身的當(dāng)前狀態(tài)作出不同的反應(yīng), 這個(gè)模式的關(guān)鍵思想在于引入的操作狀態(tài)的子類提供了一個(gè)公共接口。Context類將所有與狀態(tài)相關(guān)的請求委托給這個(gè)狀態(tài)對象。Context使用它的State子類實(shí)例來執(zhí)行特定的操作,一旦狀態(tài)改變Context對象就會改變它所使用的狀態(tài)對象[1,3]。
4 熱匝薄板管理系統(tǒng)的入口背景研究
現(xiàn)以某鋼鐵企業(yè)一臺旋轉(zhuǎn)傳送裝置的入口狀態(tài)進(jìn)行建模。一臺旋轉(zhuǎn)傳送裝置是一個(gè)大型的旋轉(zhuǎn)托架,這是一臺大型的智能設(shè)備,它可以通過一個(gè)入口接受原材料,并根據(jù)標(biāo)記在原材料上的條碼ID將其進(jìn)行分類存儲。傳送裝置的入口用一個(gè)按鈕進(jìn)行操作控制,如果入口處于關(guān)閉狀態(tài),那么按下這個(gè)按鈕可以將入口打開,如在入口完全開啟前,我們再次觸動這個(gè)按鈕則入口關(guān)閉。如該入口完全開啟狀態(tài)超過2秒,則因超時(shí)而關(guān)閉。我們可以在入口開啟時(shí),再次按下按鈕從而可以避免入口因?yàn)榘l(fā)生超時(shí)而關(guān)閉[4]。如圖2說明了該傳送裝置入口的狀態(tài)以及狀態(tài)遷移關(guān)系。
5 基于狀態(tài)模式的入口建模
如圖3所示,我們?yōu)閭魉脱b置入口的每個(gè)狀態(tài)創(chuàng)建了一個(gè)對應(yīng)的類。每個(gè)狀態(tài)類包括了一個(gè)Touch()方法,這個(gè)方法定義了當(dāng)入口處于某個(gè)狀態(tài)時(shí),操作人員觸動按鈕之后,系統(tǒng)執(zhí)行的代碼邏輯。在新的設(shè)計(jì)中我們沒有改變Door2對象的角色,我們?nèi)匀皇褂肈oor2對象中的_state對象,并且讓多態(tài)發(fā)揮了非常重要的作用。Touch(),Complete(),Timeout()以及Status()方法都應(yīng)用了多態(tài),每個(gè)方法都表示一類遷移。雖然客戶調(diào)用了相同的操作,但是接收者類(即狀態(tài)類)可能不同。其多態(tài)規(guī)則要求當(dāng)調(diào)用一個(gè)方法時(shí),實(shí)際執(zhí)行的方法不僅取決于操作的特征標(biāo)記,同時(shí)還取決于操作的接收者類。思路如下:
Private DoorState _state;
Public class Door2
{
// 變量和構(gòu)造函數(shù)
Public void Touch()//取得抽象Touch()方法
Public void Complete() //取得抽象Complete()方法
Public void Timeout() //取得抽象Timeout()方法
Public string Status() //取得抽象Status()方法
Public void SetStatus(DoorState state)
//表示入口狀態(tài)改變的方法
}
由于DoorOpening,DoorOpen, DoorClosed,以及DoorClosing, DoorStayOpen的實(shí)現(xiàn)方式相似,在此我們僅以DoorOpen子類為例進(jìn)行詳細(xì)說明。如圖3所示,其中DoorState是一個(gè)抽象類,且DoorOpen是DoorState子類 ,那么我們必須通過子類DoorOpen對父類DoorState的方法進(jìn)行覆蓋。思路如下:
Public class DoorOpen: DoorState
{
Public DoorOpen(Door2 door):base(door)
{
Public override void Touch()
{
…… //僅在DoorOpen狀態(tài)觸發(fā)
Touch()方法后的狀態(tài)改變
}
Public override void Timeout()
{
{
…… //僅在DoorOpen狀態(tài)觸發(fā)
Timeout()方法后的狀態(tài)改變
}
}
}
由此可見通過狀態(tài)模式將所有與一個(gè)特定的狀態(tài)相關(guān)的行為都放入一個(gè)對象中。因?yàn)樗信c狀態(tài)相關(guān)的代碼都存在于一個(gè)狀態(tài)子類中,所以通過定義新的子類可以很容易的增加新的狀態(tài)和轉(zhuǎn)換。
6 結(jié)束語
實(shí)踐說明通過使用狀態(tài)模式可以將狀態(tài)相關(guān)行為局部化,并且通過將不同的狀態(tài)分割開來,從而使得所有與狀態(tài)相關(guān)的代碼存在于某一個(gè)狀態(tài)子類中,所以通過定義新的子類可以很容易的增加新的狀態(tài)和轉(zhuǎn)換,從而滿足業(yè)務(wù)發(fā)展的需要。設(shè)計(jì)模式的產(chǎn)生,使軟件設(shè)計(jì)人員可以借鑒他人的成功經(jīng)驗(yàn)找到軟件架構(gòu)設(shè)計(jì)的解決方案,所以對于設(shè)計(jì)模式的理解和運(yùn)用需要我們在實(shí)踐中不斷的摸索與總結(jié)[5]。
參考文獻(xiàn):
[1] 何成萬,何克清.基于角色的設(shè)計(jì)模式建模和實(shí)現(xiàn)[J].軟件學(xué)報(bào),2006(4).
[2] 李燁,趙曦濱,李暉.設(shè)計(jì)模式在郵政代理保險(xiǎn)系統(tǒng)中的研究與應(yīng)用[J].計(jì)算機(jī)工程,2006(2).
[3] Gamma E, Helm R.Design Pattern[M].北京:機(jī)械工業(yè)出版社,2000:200-212.
[4] Jose H.Antonio SAP R/3 Administrator's[M].Handbook McGraw-Hill Osborne Media,1999.
[5] 曾志明,朱江.設(shè)計(jì)模式在可復(fù)用GIS軟件開發(fā)中的應(yīng)用[J].計(jì)算機(jī)工程,2006(4).