周昱晨 羅向陽 張豪
摘 要: 針對雜志庫存管理問題,基于面向?qū)ο笏枷?,運(yùn)用設(shè)計模式設(shè)計了一個庫存管理系統(tǒng)。通過問題域部件設(shè)計,將系統(tǒng)劃分為人員管理、物資管理和收益管理三部分,并設(shè)計了相關(guān)表單;通過任務(wù)管理部件設(shè)計,運(yùn)用單例模式實現(xiàn)了并發(fā)審核,運(yùn)用觀察者模式保證了數(shù)據(jù)查詢的準(zhǔn)確和實時,運(yùn)用狀態(tài)模式實現(xiàn)了庫存的調(diào)取,運(yùn)用裝飾器模式實現(xiàn)了收益統(tǒng)計,運(yùn)用策略模式評估了來年印數(shù)與保留庫存數(shù);通過數(shù)據(jù)管理部件和人機(jī)交互部件設(shè)計,運(yùn)用抽象工廠結(jié)合簡單工廠的模式實現(xiàn)了多數(shù)據(jù)源訪問支持;最后設(shè)計了用例進(jìn)行測試。測試結(jié)果表明,該系統(tǒng)可以滿足雜志庫存管理的使用需求。
關(guān)鍵詞: 面向?qū)ο笤O(shè)計; 問題域部件; 任務(wù)管理部件; 數(shù)據(jù)管理部件; 人機(jī)交互部件; 設(shè)計模式
中圖分類號:TP311.5 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2018)09-33-04
Abstract: Aiming at the problem of inventory control of magazine, the object-oriented design pattern was used to design the inventory management system. In the design process of the problem domain components, the system was divided into 3 parts: personnel management, material management and earnings management, and business related forms were designed. In the design process of task management components, the singleton pattern was used to realize concurrent audit, the observer pattern was used to guarantee the accuracy and real-time of data query, the state pattern was used to realize inventory control, the decorator pattern was used to statistics of revenue and expenditure, the strategy pattern was used to evaluate the number of next year's printing and storage quantity. And in the design process of data management components and human interaction components, the abstract factory was used with the combination of the simple factory pattern to achieve the multiple data source access support. Finally, the use cases were designed and tested, and the results show that the system meets the needs of inventory management of magazine.
Key words: object-oriented design; problem domain components; task management components; data management components; human interaction components; design pattern
0 引言
倉儲管理日益受到重視,當(dāng)前研究主要著眼兩方面:①優(yōu)化庫區(qū)、路徑等;②根據(jù)業(yè)務(wù)設(shè)計優(yōu)良的倉儲管理系統(tǒng)[1]。
倉儲管理系統(tǒng)應(yīng)用廣泛。楊春紅[2]運(yùn)用VB語言設(shè)計了快消品企業(yè)倉儲系統(tǒng),但其對模塊的實現(xiàn)敘述簡略;朱宇哲[3]等運(yùn)用SSH框架設(shè)計了一個鋼廠庫存管理系統(tǒng),通過MVC模型實現(xiàn)了底層數(shù)據(jù)、中間業(yè)務(wù)邏輯、前端視圖的分離,但一方面作者運(yùn)用的還是結(jié)構(gòu)化設(shè)計思想,另一方面MVC不是一種設(shè)計模式,可看作多種模式的組合,雖然在系統(tǒng)層面實現(xiàn)了解耦,但在實現(xiàn)特定功能時解耦不如設(shè)計模式徹底。文獻(xiàn)[3]代表了當(dāng)下庫存管理系統(tǒng)設(shè)計的主流思路,反映出設(shè)計思想和實現(xiàn)方法有創(chuàng)新和改進(jìn)的空間。
面向?qū)ο笏枷胧剐畔⒛P偷谋硎九c客觀實體相對應(yīng),符合人類的思維習(xí)慣,在軟件開發(fā)中應(yīng)用廣泛。張瑋[4]對軟件工程中結(jié)構(gòu)化方法與面向?qū)ο蠓椒ㄟM(jìn)行了比較,但沒有實例驗證;馮德虎[5]、徐帆[6]對面向?qū)ο蠓治雠c設(shè)計方法作了綜述,但文章偏重概念陳述而沒有對他人成果給出歸納,且文中的例子也只說明了對象建模技術(shù)(object modeling technology,OMT),不涉及設(shè)計模式;張宇等[7]論述了面向?qū)ο笤O(shè)計原則與設(shè)計模式之間的關(guān)系,但也沒有用實例驗證;周靜[8]運(yùn)用Java實現(xiàn)了抽象工廠,卻只給出了代碼,實用性不強(qiáng);雷金勇等[9]舉例說明了設(shè)計模式在暫態(tài)仿真中的應(yīng)用,但沒有明確將面向?qū)ο?大部件設(shè)計與模式對應(yīng)起來。
本文結(jié)合單位業(yè)務(wù)需求,運(yùn)用面向?qū)ο笏枷胪瓿上到y(tǒng)開發(fā),并在部件設(shè)計過程中引入模式,通過用例來測試系統(tǒng)可行性。
1 面向?qū)ο笤O(shè)計原則及模式
1.1 設(shè)計原則
面向?qū)ο笤O(shè)計遵循開閉原則。以此為基礎(chǔ),又衍生出了6大原則[10]。
⑴ 單一職責(zé):一個類一個功能,提高模塊的內(nèi)聚;
⑵ 迪米特法則:模塊間解耦;
⑶ 里氏替換:繼承原則,子類無縫代替父類;
⑷ 依賴倒置:①高層不依賴低層;②抽象不依賴實現(xiàn);
⑸ 接口隔離:單個復(fù)雜接口拆分為多個獨立接口;
⑹ 合成復(fù)用:用組合/聚合實現(xiàn)功能而不用繼承。
1.2 設(shè)計模式
1.2.1 創(chuàng)建型模式
⑴ 單例(Singleton):全局只要一個實例;
⑵ 原型(Protoype):通過拷貝原型而不實例化創(chuàng)建新對象;
⑶ 工廠(Factory):對象創(chuàng)建可控,隱藏具體類名實現(xiàn)解耦;
⑷ 抽象工廠(Abstract Factory):類根據(jù)需要返回不同對象,對象與屬性匹配;
⑸ 建造者(Build):生成對象與構(gòu)造順序無關(guān),對象實例邏輯在類外。
1.2.2 結(jié)構(gòu)型模式
⑴ 適配器(Adapter):適配不同接口的類,方法各不同;
⑵ 裝配器(Dacorator):比繼承靈活,可組合形成多種擴(kuò)展類;
⑶ 代理(Proxy):可用于身份驗證;
⑷ 外觀(Facade):對模塊封裝,給子系統(tǒng)接口;
⑸ 橋接(Bridge):抽象與實現(xiàn)分離;
⑹ 享元(Plyweight):相同對象重用,用于共享數(shù)據(jù);
⑺ 組合(Composite):整體與部分相同,通過對象訪問對象樹。
1.2.3 行為型模式
⑴ 策略(Strategy):不同方法在一個類中,可選擇;
⑵ 模板(Template):具有相同流程;
⑶ 觀察者(Observer):一對多關(guān)系,被觀察者變化時回調(diào);
⑷ 迭代器(Iterator):內(nèi)部實現(xiàn)無關(guān)的集合遍歷,順序訪問集合中各元素;
⑸ 責(zé)任鏈(Chain of Responsibility):多個類處理一個請求,不了解彼此功能,類間唯一聯(lián)系是互相傳遞請求,直到其中一個類處理;
⑹ 命令(Commond):特定操作的請求封裝到一個對象中,客戶端不了解實際執(zhí)行就產(chǎn)生請求;
⑺ 備忘錄(Memento):為對象提供存儲和恢復(fù)手段;
⑻ 狀態(tài)(State):對象表示程序狀態(tài),通過轉(zhuǎn)換對象狀態(tài)來轉(zhuǎn)換程序狀態(tài)。
⑼ 訪問者(Visitor):分離對象的數(shù)據(jù)和行為;
⑽ 解釋器(Interpreter):可用于純文本表達(dá)式執(zhí)行。
2 問題域部件設(shè)計
本系統(tǒng)將業(yè)務(wù)邏輯分為人員管理、庫存管理和收益管理三大部分。
人員管理即登記系統(tǒng)的操作員,需要創(chuàng)建:人員表(編號,姓名,手機(jī))。
庫存管理主要分為入庫管理和出庫管理。出庫又分為發(fā)行和執(zhí)行訂單,故創(chuàng)建:庫存表(編號,年份,月份,庫存數(shù)量);發(fā)行表(編號,發(fā)行單位,年份,月份,數(shù)量);訂單表(編號,客戶姓名,年份,月份,數(shù)量)。
收益管理分為收入管理和支出管理。收入分為訂單收入和發(fā)行收入,支出分為發(fā)行運(yùn)費和訂單運(yùn)費,故建立:發(fā)行運(yùn)費表(編號,發(fā)行單位,年份,月份,運(yùn)費);訂單運(yùn)費表(編號,客戶姓名,年份,月份,運(yùn)費);訂單收益表(編號,客戶姓名,年份,月份,金額),發(fā)行收益表(編號,發(fā)行單位,年份,月份,金額)。
3 任務(wù)管理部件設(shè)計
3.1 人員管理
系統(tǒng)操作員注冊和登錄后可使用系統(tǒng)。由于本社人員不多且系統(tǒng)業(yè)務(wù)流程也不算復(fù)雜,為讓有人不在崗時流程依然可進(jìn)行,故操作權(quán)限對所有成員放開。
3.2 庫存管理
3.2.1 單例模式
從系統(tǒng)業(yè)務(wù)邏輯可知,由于成員權(quán)限相同,需控制并發(fā)處理產(chǎn)生的沖突。單例模式全局只要一個實例,成員進(jìn)入修改界面時生成Singleton類的實例,而Singleton類通過單例模式對生成實例數(shù)進(jìn)行控制,當(dāng)一個成員在修改庫存數(shù)時其他成員不能再進(jìn)行修改。單例模式原理如圖1所示。
3.2.2 觀察者模式
本文將運(yùn)用觀察者模式,通過引入一個數(shù)據(jù)庫代理作主體目標(biāo),系統(tǒng)操作員作為觀察者關(guān)注主體目標(biāo)的狀態(tài)變化。當(dāng)其中一個操作員查詢庫存時另一個操作員對庫存進(jìn)行了修改,數(shù)據(jù)代理就會發(fā)出一個狀態(tài)變化通報給各個觀察者,確保實時性。數(shù)據(jù)庫代理不清楚系統(tǒng)有多少觀察者,它只在數(shù)據(jù)變化時通知所有正在查詢數(shù)據(jù)的觀察者,同樣各個觀察者只關(guān)注數(shù)據(jù)而不參與數(shù)據(jù)改變的細(xì)節(jié),可在對象間解耦,使得主體目標(biāo)和觀察者都可自由改變,且因主體不關(guān)心觀察者,增加了重用性。觀察者模式邏輯圖如圖2所示。
3.2.3 狀態(tài)模式
通過業(yè)務(wù)邏輯分析可知,倉庫有入庫、空閑和出庫這三種狀態(tài)。當(dāng)空閑時,庫存數(shù)沒有變化,故操作員只查數(shù)據(jù)不進(jìn)行修改;進(jìn)行出入庫操作時,要修改庫存數(shù)。入庫只在有新雜志送達(dá)后才進(jìn)行,出庫在接到訂單或到達(dá)發(fā)行日時進(jìn)行。
本文通過狀態(tài)模式將狀態(tài)間的轉(zhuǎn)換規(guī)則封裝到具體的類中,若以后本社的業(yè)務(wù)發(fā)生了變化,要修改轉(zhuǎn)換圖的轉(zhuǎn)換規(guī)則時,只需更改部分對應(yīng)類中的狀態(tài)遷移規(guī)則就可以了,提高了代碼的可維護(hù)性。
狀態(tài)模式邏輯圖如圖3所示。
3.3 收益管理
3.3.1 裝飾器模式
裝飾器主要用來實現(xiàn)功能擴(kuò)展,即降低了耦合也降低了系統(tǒng)復(fù)雜度。收益管理中有發(fā)行運(yùn)費支出,訂單運(yùn)費支出,發(fā)行收入和訂單收入。進(jìn)行統(tǒng)計時,在發(fā)行運(yùn)費支出的基礎(chǔ)上擴(kuò)展發(fā)行收入可得發(fā)行收益,訂單收益亦然。裝飾器模式邏輯圖如圖4所示。
3.3.2 策略模式
本社每年底都要清理本年雜志,只保留一定數(shù)量作庫存,并確定來年印數(shù)。本文運(yùn)用策略模式,將發(fā)行數(shù)和訂單數(shù)放在數(shù)量類中,將支出數(shù)與收入數(shù)放在金額類中。運(yùn)用策略模式調(diào)用發(fā)行數(shù)與收入金額數(shù)可知發(fā)行數(shù)與收益關(guān)系,據(jù)此可大致估算來年印數(shù),以期不浪費;調(diào)用訂單數(shù)與收入金額數(shù)可知訂單數(shù)與收益關(guān)系,以此可估算保留庫存數(shù),以期收益最大化。 策略模式邏輯圖如圖5所示。
4 數(shù)據(jù)管理部件和人機(jī)交互部件設(shè)計
數(shù)據(jù)管理部件負(fù)責(zé)訪問數(shù)據(jù)庫,人機(jī)交互部件負(fù)客戶端展現(xiàn)。為減少需求變化造成系統(tǒng)修改的工作量,本文采用與簡單工廠模式相結(jié)合的抽象工廠模式,實現(xiàn)只有一個具體工廠類而有多個產(chǎn)品族。當(dāng)業(yè)務(wù)邏輯發(fā)生變化時,只要修改相應(yīng)產(chǎn)品類并對具體工廠類做少量的修改即可。由于前端、后臺邏輯近似,且JAVA中有特定的接口,限于篇幅圖表省略。
5 結(jié)束語
本文運(yùn)用面向?qū)ο笏枷朐O(shè)計了一款雜志倉儲管理系統(tǒng),較文獻(xiàn)中主流的結(jié)構(gòu)化設(shè)計方法思路上有所創(chuàng)新;在實現(xiàn)功能時運(yùn)用了設(shè)計模式,既實現(xiàn)了解耦又提高了維護(hù)性。研究結(jié)果表明:該系統(tǒng)可滿足單位日常使用需求。
下一步,將進(jìn)一步完善數(shù)據(jù)管理部件和人機(jī)交互部件,提升系統(tǒng)擴(kuò)展性。
參考文獻(xiàn)(References):
[1] 沈捷.快消品企業(yè)倉儲管理系統(tǒng)的設(shè)計與實施[D].江西財經(jīng)大學(xué)信息管理學(xué)院碩士學(xué)位論文,2017.
[2] 楊春紅.基于VB和Access的倉庫管理系統(tǒng)[J].電腦編程技巧與維護(hù),2017.24:57-59
[3] 朱宇哲,李 奇.基于SSH框架的鋼廠庫存管理系統(tǒng)的分析和設(shè)計[J].工業(yè)控制計算機(jī),2018.5:131-133
[4] 張 瑋.軟件工程中結(jié)構(gòu)化方法與面向?qū)ο蠓椒ǖ谋容^研究[J].無線互聯(lián)科技,2017.21:52-53
[5] 馮德虎.面向?qū)ο蠓治雠c設(shè)計綜述[J].技術(shù)與市場,2011.18(5):122-122
[6] 徐 帆.面向?qū)ο箝_發(fā)方法綜述[J].重慶工商大學(xué)學(xué)報:自然科學(xué)版,2002.19(4):87-90
[7] 張宇,莊晉林.面向?qū)ο笤O(shè)計原則和設(shè)計模式的應(yīng)用[J].華北水利水電大學(xué)學(xué)報:自然科學(xué)版,2007.28(1):63-65
[8] 周靜.JAVA設(shè)計模式之工廠方法模式的研究與應(yīng)用[J].科技信息:科學(xué)教研,2007.20:90-91
[9] 雷金勇,李 鵬,于學(xué)軍,等.面向?qū)ο蟮脑O(shè)計模式在暫態(tài)仿真中的應(yīng)用[J].電力系統(tǒng)及其自動化學(xué)報,2012.24(3):35-40
[10] GAMMA E著,李英軍譯.設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].機(jī)械工業(yè)出版社,2007.