摘要:結(jié)合條碼采集系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā),探討了設(shè)計(jì)模式中的Observer模式與Command模式,結(jié)果表明:使用Observer模式進(jìn)行數(shù)據(jù)管理,使用Command模式進(jìn)行功能管理,可以增強(qiáng)系統(tǒng)代碼的重用性、靈活性和模塊化,提高了系統(tǒng)開(kāi)發(fā)效率。
關(guān)鍵詞:設(shè)計(jì)模式;Observer模式;Command模式
中圖分類(lèi)號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)04-1002-02
The Research about Application of Observer Pattern and Command Pattern in Barcodes Collecting System
JIAO Fu-qiang1, MIN Lian-ying1, ZHAO Hui2, PEI Chao-ju1
(1.Computer Department, Wuhan University of Technology, Wuhan 430063, China ;2 Basic Department, Henan Business College,Zhengzhou 450044, China)
Abstract: The discussion of Observer Pattern and Command Pattern based on the designing and development of the Barcodes Collecting System come to the conclusion that the using of Observer Pattern and Command Pattern in the Barcodes Collecting System enhanced the reusability, flexibility and modularity of the codes of the Barcodes Collecting System and improve the development efficiency of the system.
Key words: design pattern; observer pattern; command pattern
1 引言
近年來(lái),隨著信息技術(shù)的飛速發(fā)展,各企業(yè)紛紛組建起自己的信息管理系統(tǒng)。產(chǎn)品入庫(kù)與售后服務(wù)是企業(yè)生產(chǎn)的重要環(huán)節(jié),同時(shí)也是企業(yè)管理系統(tǒng)數(shù)據(jù)的第一手資料來(lái)源,所以更應(yīng)該重視其數(shù)據(jù)的準(zhǔn)確性、有效性及全面性。文中將介紹基于SmartArm2200+μcLinux+QT的手持設(shè)備上實(shí)現(xiàn)的條碼采集系統(tǒng),本文只討論上層軟件以及實(shí)現(xiàn)過(guò)程中Observer模式和Command模式的應(yīng)用。
2 設(shè)計(jì)模式
設(shè)計(jì)模式描述了在面向?qū)ο筌浖O(shè)計(jì)過(guò)程中針對(duì)特定問(wèn)題的簡(jiǎn)潔而優(yōu)雅的解決方案。
設(shè)計(jì)模式最重要的思想是“封裝變化的概念”。一方面,設(shè)計(jì)的軟件具有一定的靈活性,以適應(yīng)可能的變化;另一方面,把這種復(fù)雜性所帶來(lái)的軟件復(fù)雜性進(jìn)行封裝,為外界提供一個(gè)簡(jiǎn)單而又穩(wěn)定的訪問(wèn)接口。
3 條碼采集系統(tǒng)簡(jiǎn)介
該條碼采集系統(tǒng)主要通過(guò)掃描傳感器掃入條碼數(shù)據(jù),經(jīng)過(guò)系統(tǒng)的加工,通過(guò)通信接口傳入上位機(jī)。它的主要功能:采集傳感器轉(zhuǎn)換后的條碼信息并將其顯示在LCD顯示屏上,用戶通過(guò)鍵盤(pán)向系統(tǒng)提出自已的要求,條碼采集系統(tǒng)通過(guò)處理按鍵消息以及菜單消息以響應(yīng)用戶提出的要求,實(shí)現(xiàn)用戶與系統(tǒng)之間的交互。本系統(tǒng)以條碼信息、地址信息、索引信息,條碼類(lèi)型的組合為基本操作單位(簡(jiǎn)稱條碼記錄)。本系統(tǒng)主要處理三種類(lèi)型的條碼記錄,它們是:無(wú)符加信息的條碼記錄,入庫(kù)產(chǎn)品條碼記錄和銷(xiāo)售產(chǎn)品條碼記錄。本系統(tǒng)實(shí)現(xiàn)了入庫(kù)產(chǎn)品與銷(xiāo)售產(chǎn)品信息采集與處理功能。條碼采集系統(tǒng)共分為五個(gè)功能模塊,分別為:
1) 用戶界面顯示模塊:完成條碼信息采集,然后將條碼信息顯示在界面上。負(fù)責(zé)用戶與系統(tǒng)之間的交互,正確地將信息顯示在添加頁(yè)面、刪除頁(yè)面、修改頁(yè)面,預(yù)覽頁(yè)面。
2) 業(yè)務(wù)邏輯模塊:主要完成對(duì)條碼記錄中各個(gè)數(shù)據(jù)單元(條碼信息、地址信息、索引信息等)按照預(yù)定好的規(guī)則進(jìn)行修改、刪除、添加等操作。
3) 數(shù)據(jù)存儲(chǔ)模塊:將處理過(guò)的數(shù)據(jù)按照預(yù)先設(shè)定好的格式存儲(chǔ)。
4) 數(shù)據(jù)通信模塊:以預(yù)先制定的通信協(xié)義組織、驗(yàn)證通信數(shù)據(jù);負(fù)責(zé)該手持設(shè)備與外部設(shè)備通過(guò)串口穩(wěn)定而正確地進(jìn)行通信。
5) 條碼解析模塊:識(shí)別條碼記錄的類(lèi)型,如果是入庫(kù)產(chǎn)品條碼記錄與銷(xiāo)售產(chǎn)品條碼記錄,則根據(jù)相應(yīng)的檢驗(yàn)規(guī)則判定待檢驗(yàn)條碼記錄的合法性。如果條碼記錄合法,則按照預(yù)先的設(shè)定的規(guī)則對(duì)條碼進(jìn)行解析,提取出有效信息,顯示在預(yù)覽頁(yè)面上。
4 Observer模式、Command模式在條碼采集系統(tǒng)中的應(yīng)用
4.1 系統(tǒng)設(shè)計(jì)分析
本系統(tǒng)中存在的兩個(gè)問(wèn)題是:
1) 當(dāng)發(fā)生業(yè)務(wù)邏輯動(dòng)作,條碼記錄的內(nèi)容或數(shù)量發(fā)生變化,而與條碼記錄的顯示頁(yè)面卻不能及時(shí)地反映數(shù)據(jù)的變化。如當(dāng)新增一條條碼記錄時(shí),由于修改頁(yè)面與預(yù)覽頁(yè)面沒(méi)有得到數(shù)據(jù)變化的消息,因此顯示的數(shù)據(jù)(條碼記錄數(shù)等)便與實(shí)際數(shù)據(jù)不一致了;當(dāng)我們?cè)趧h除頁(yè)面刪除最后一條記錄,修改頁(yè)面與預(yù)覽頁(yè)面卻顯示還有一條條碼記錄;當(dāng)把一條入庫(kù)條碼記錄修改為銷(xiāo)售條碼記錄,但由于預(yù)覽、刪除頁(yè)面沒(méi)有得到通知,它們顯示未修時(shí)的條碼記錄信息。 這必將給企業(yè)生產(chǎn)上和管理上帶來(lái)很大的麻煩,造成不必要的浪費(fèi)和損失。
2) 我們對(duì)三種類(lèi)型的條碼記錄進(jìn)行操作,可以用枚舉型值來(lái)標(biāo)識(shí)三種類(lèi)型,如0,1,2分別代表無(wú)符加信息條碼記錄、入庫(kù)產(chǎn)品條碼記錄和銷(xiāo)售產(chǎn)品條碼記錄,如果我們想讓0代表入庫(kù)產(chǎn)品條碼記錄,1代表無(wú)符加信息條碼記錄,那么與類(lèi)型相關(guān)的代碼均需要修改;如果我們要新增一種條碼記錄,則要新增類(lèi)型枚舉定義,新類(lèi)型賦值,新類(lèi)型判別相關(guān)代碼;這樣命令的發(fā)出者與執(zhí)行者緊密耦合,進(jìn)行修改時(shí)工作量大,容易出錯(cuò)。
為解決以上兩個(gè)問(wèn)題,本文只討論Observer模式、Command模式在用戶界面顯示模塊以及業(yè)務(wù)邏輯模塊中的應(yīng)用,其結(jié)構(gòu)圖如圖1所示。
條碼采集系統(tǒng)使用MVC(Model-View-Controller)整體框架。模型(Model)(Data類(lèi))用于表示數(shù)據(jù)和業(yè)務(wù)規(guī)則,模型返回的數(shù)據(jù)是與數(shù)據(jù)格式無(wú)關(guān)的,一個(gè)模型號(hào)能為多個(gè)視圖提供數(shù)據(jù)。視圖(View)(Page類(lèi))是用戶看到并與之交互的界面??刂破鳎–ontroller)
(MyManager類(lèi))接受用戶的輸入并調(diào)用視圖去完成用戶的需求。當(dāng)用戶按鍵時(shí),控制器本身不輸出任何東西和做任何處理。它只是接收請(qǐng)求并決定調(diào)用哪個(gè)模型去處理請(qǐng)求,然后確定用哪個(gè)視圖來(lái)顯示模型處理返回的數(shù)據(jù),負(fù)責(zé)一部分職能。如果某一部分的需求發(fā)生變化,只需改動(dòng)相應(yīng)的部分即可。可使系統(tǒng)開(kāi)發(fā)工作更加系統(tǒng)化、模塊化,更能體現(xiàn)面向?qū)ο蟮脑O(shè)計(jì)思想,提高了系統(tǒng)的可擴(kuò)展性。
4.2 Observer模式在顯示模塊的應(yīng)用
Observer模式的意圖是:“定義對(duì)象間的一種一對(duì)多依賴關(guān)系,當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新”[2]。
使用Observer模式,可以使本系統(tǒng)在用戶界面和業(yè)務(wù)邏輯之間劃分清晰的界限。Data即為Subject,Page即為Observer,當(dāng)主體對(duì)象中發(fā)生更改時(shí),觀察者就會(huì)觀察這種更改,并相應(yīng)地更新其顯示。
下面以AddPage為例子,詳細(xì)描述了Observer模式在本系統(tǒng)的應(yīng)用過(guò)程。在這個(gè)過(guò)程中涉及到的類(lèi)以及類(lèi)的主要方法如圖2所示。
主體(ConcreteData)維護(hù)一個(gè)類(lèi)型為vector
另處,觀察者與主體均采用面向接口的技術(shù)實(shí)現(xiàn),利用這些接口有助于減少觀察者和主體這間的耦合關(guān)系,使得觀察者和主體都可以獨(dú)立地發(fā)生結(jié)構(gòu)上的變化,而使另一方受到較小的影響。這種方法將接口編程模型的優(yōu)點(diǎn)擴(kuò)展到本系統(tǒng)中。
4.3 Command模式在業(yè)務(wù)邏輯模塊的應(yīng)用
Command模式的意圖是:將一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤消的操作[3]。每一個(gè)命令都是一個(gè)操作:請(qǐng)求的一方發(fā)出請(qǐng)求要求執(zhí)行一個(gè)操作;接收的一方收到請(qǐng)求,并執(zhí)行操作。命令模式允許請(qǐng)求的一方和接收的一方獨(dú)立開(kāi)來(lái),使得請(qǐng)求的一方不必知道接收請(qǐng)求的一方的接口,更不必知道請(qǐng)求是怎么被接收,以及操作是否被執(zhí)行、何時(shí)被執(zhí)行,以及是怎么被執(zhí)行的。
條碼采集系統(tǒng)的核心問(wèn)題是對(duì)條碼信息進(jìn)行處理,系統(tǒng)中有修改、添加、刪除等數(shù)據(jù)操作,在業(yè)務(wù)邏輯模塊使用Command模式使該系統(tǒng)層次更加分明,職責(zé)更加明確,結(jié)構(gòu)更加清晰,系統(tǒng)更加容易擴(kuò)展。
下面以AddCom為例子,詳細(xì)描述了Command模式在本系統(tǒng)的應(yīng)用過(guò)程。在這個(gè)過(guò)程中涉及到的類(lèi)以及類(lèi)的主要方法如圖3所示。
請(qǐng)求者(MyManger)維護(hù)一個(gè)類(lèi)型為vector
5 結(jié)束語(yǔ)
實(shí)踐證明,將Observer模式和Command模式引入到條碼采集系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中,有效提高了軟件開(kāi)發(fā)的效率,保證了代碼的可重用性和系統(tǒng)的可擴(kuò)展性,可以滿足不斷增長(zhǎng)的不同用戶的不同業(yè)務(wù)需求。設(shè)計(jì)模式使軟件設(shè)計(jì)人員能夠快速地根據(jù)問(wèn)題找到對(duì)應(yīng)的解決方案。借鑒他人的成功經(jīng)驗(yàn),既可以將其應(yīng)用于整體的軟件架構(gòu)設(shè)計(jì),也可應(yīng)用與軟件中某一部分的微體系結(jié)構(gòu)設(shè)計(jì)。對(duì)設(shè)計(jì)模式的理解和運(yùn)用需要我們?cè)趯?shí)踐中不斷地摸索和總結(jié)。
參考文獻(xiàn):
[1] Gamma E,Helm R,Champaign U,et al.設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].李英軍,譯.北京:機(jī)械工業(yè)出版社,2005.
[2] Parikh G.Software Support, Management, and Evolution in the Coming Decade and Beyond Opportunities Challenges[C]//Proceedings of the 21st IEEE International Conference on Software Maintenance,Washington, D. C. 2005.
[3] 劉海巖,鎖志海,呂青,等.設(shè)計(jì)模式及其在軟件設(shè)計(jì)中的應(yīng)用研究[J].西安交通大學(xué)學(xué)報(bào),2005,39(10):1043-1047.