摘要:在基于構(gòu)件的計(jì)算機(jī)軟件系統(tǒng)管理軟件開發(fā)中,利用UML圖的良好溝通特性,促進(jìn)用戶、設(shè)計(jì)人員、分析人員、編碼及測試人員對所開發(fā)系統(tǒng)的統(tǒng)一認(rèn)識,將UML建模貫穿整個過程。在構(gòu)件開發(fā)的過程中用UML把對單例模型的描述統(tǒng)一起來,才能達(dá)到構(gòu)件的最大程度重用的目的。但目前還沒有把兩者的優(yōu)勢充分結(jié)合起來,計(jì)算機(jī)軟件系統(tǒng)服務(wù)模型接口設(shè)計(jì)在項(xiàng)目開發(fā)中進(jìn)行了嘗試。
關(guān)鍵詞:UML;構(gòu)件;計(jì)算機(jī)軟件
一、引言
UML(Unified Modeling Language)是業(yè)內(nèi)統(tǒng)一的建模語言,有著豐富的基于面向?qū)ο蟾拍畹哪P驮丶皥D形表示元素,還具有強(qiáng)大的描述能力以及廣泛的描述范圍,其為不同領(lǐng)域的用戶提供統(tǒng)一的交流標(biāo)準(zhǔn)。基于UML 的工作流建??梢赃\(yùn)用用戶例圖捕獲用戶需求,使用活動圖闡述業(yè)務(wù)邏輯,使用狀態(tài)圖描述工作流邏輯中實(shí)體狀態(tài)的變化?;赨ML 的工作流建模具有如下優(yōu)點(diǎn)[1]:
1.具有定義明確的通用的語義及表示法,便于理解與溝通。工作流管理系統(tǒng)往往是大型的、結(jié)構(gòu)復(fù)雜的,需要眾多人員協(xié)同工作,因此參與者之間能否對彼此在各階段設(shè)計(jì)與開發(fā)的成果進(jìn)行有效的無歧義的交流尤為重要,采用UML建模便能很好地解決這個問題。
2.具有種類繁多的概念與模型,對模型的描述更加全面。
3.對用戶友好。然而,用UML 用例圖、活動圖、狀態(tài)圖對工作流建模,無法直觀地區(qū)分業(yè)務(wù)邏輯與工作流邏輯,限制了對外部事件如事件的表達(dá),并且不支持模型驗(yàn)證與優(yōu)化。在基于UML 的建模過程中,常使用活動圖對流程的動態(tài)行為進(jìn)行建模。它支持對信息流的描述,體現(xiàn)活動時(shí)序,支持對選擇路由與并發(fā)路由的描述。與基于Petri 網(wǎng)的建模方法相比,二者各有所長。
二、UML計(jì)算機(jī)軟件系統(tǒng)設(shè)計(jì)方法
(一)UML工廠建模設(shè)計(jì)
UML工廠方法模式是一種常用的創(chuàng)建型設(shè)計(jì)模式。該模式將各對象的共同屬性抽取出來,構(gòu)造一個抽象類,將各實(shí)例的特有屬性抽取出來生成不同的子類,子類繼承共同屬性對應(yīng)的抽象類。它為用戶提供了創(chuàng)建對象的接口[2]。工廠模式符合并體現(xiàn)了面向?qū)ο笾蟹庋b、分派等思想。常見的工廠模式有:簡單工廠模式、工廠方法模式及抽象工廠模式三種。
工廠方法模式的優(yōu)點(diǎn):
1.隱藏實(shí)例化細(xì)節(jié)
在工廠方法模式中,客戶不需要關(guān)心創(chuàng)建具體產(chǎn)品類的過程與細(xì)節(jié)(所有的實(shí)例化細(xì)節(jié)都將被隱藏),甚至無需知道具體產(chǎn)品類的類名,只要獲取需對應(yīng)的工廠方法,就能創(chuàng)建所需要的具體類(即使用戶對該具體類一無所知)。
2.角色的多態(tài)性
在工廠方法模式中,無論是產(chǎn)品類還是工廠方法都具有多態(tài)性,這也是該模式又稱之為多態(tài)工廠模式的原因。由于多態(tài)性,具體產(chǎn)品類的生成細(xì)節(jié)完好的封裝在具體的生成方法內(nèi)。使用戶可以自主確定創(chuàng)建哪一種產(chǎn)品對象,然而如何創(chuàng)建這個對象的細(xì)節(jié),則完全封裝在具體工廠內(nèi)部。
3.符合“開閉原則”
當(dāng)應(yīng)用系統(tǒng)引入新產(chǎn)品時(shí),工廠方法模式可以在不影響現(xiàn)有的具體工廠與具體產(chǎn)品類,也不修改現(xiàn)有的客戶端代碼的情況下實(shí)現(xiàn)新功能的添加。只要添加一個新的具體方法和特定的產(chǎn)品類,添加新的用戶界面(如果需要的話),就能實(shí)現(xiàn)系統(tǒng)的功能擴(kuò)展。對修改關(guān)閉,對擴(kuò)展開放,完全符合“開閉原則”。
工廠模式的缺點(diǎn):
1.增加了系統(tǒng)復(fù)雜度
對于每個產(chǎn)品,不僅要提供一個具體的產(chǎn)品類,還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,增加了系統(tǒng)的復(fù)雜性,會給系統(tǒng)帶來一些額外的開銷。
2.增加了系統(tǒng)的抽象性和理解難度。
(二)UML軟件工作流系統(tǒng)對象設(shè)計(jì)
工作流的業(yè)務(wù)過程中存在各種業(yè)務(wù)對象,即實(shí)體。以CRCC 標(biāo)準(zhǔn)運(yùn)維平臺為例,平臺中有立項(xiàng)申請、標(biāo)準(zhǔn)制定、標(biāo)準(zhǔn)修訂、標(biāo)準(zhǔn)廢止、添加分類、數(shù)據(jù)元管理等多個流程。每個流程中都有隨著工作流一起流動的對象實(shí)體[3]。不同類型的實(shí)體之間既有共性,如需求申請?zhí)?、流程ID 等信息,又有各自特定屬性。利用工廠方法模式,首先,將不同類型的實(shí)體共性抽取出來作為一個抽象的Product;然后,再構(gòu)建對應(yīng)的ConcreteProduct 實(shí)現(xiàn)類(如立項(xiàng)申請實(shí)體、標(biāo)準(zhǔn)制定實(shí)體等),各實(shí)現(xiàn)類繼承上述Product 抽象類,并實(shí)現(xiàn)Product 接口,或者重寫Product 中定義的虛函數(shù);再者,構(gòu)建一個抽象工廠類Factory,聲明創(chuàng)建對象的工廠方法;最后,構(gòu)建對應(yīng)的產(chǎn)品工廠(如立項(xiàng)申請實(shí)體生產(chǎn)工廠、標(biāo)準(zhǔn)制定實(shí)體生產(chǎn)工廠等),即ConcreteFactory 類,各具體工廠返回對應(yīng)的具體產(chǎn)品實(shí)體。
采用這種方案,由核心工廠類負(fù)責(zé)定義創(chuàng)建對象的公共接口,具體工廠(如立項(xiàng)申請工廠)繼承核心工廠類,實(shí)現(xiàn)CreateEntity 方法,用于創(chuàng)建具體類。具體類是否實(shí)例化、實(shí)例化哪個類的判斷與操作中延遲到子類完成。并且,當(dāng)新的產(chǎn)品類被增加時(shí),只需要新增一個產(chǎn)品類和一個工廠類,無需對其他子類進(jìn)行修改。這意味著當(dāng)一個新的業(yè)務(wù)流程被引進(jìn)時(shí),如在實(shí)現(xiàn)了立項(xiàng)申請功能的基礎(chǔ)上增加標(biāo)準(zhǔn)制定的業(yè)務(wù)流程,只需要增加一個標(biāo)準(zhǔn)制定的流程實(shí)體類和一個對應(yīng)的工廠類(其中標(biāo)準(zhǔn)制定實(shí)體繼承流程實(shí)體類,標(biāo)準(zhǔn)制定工廠繼承核心工廠類并實(shí)現(xiàn)CreateEntity 方法),無需對立項(xiàng)申請模塊進(jìn)行任何修改,就能實(shí)現(xiàn)系統(tǒng)功能的擴(kuò)展,符合面向?qū)ο蟮拈_閉原則。此外,一個大型項(xiàng)目的實(shí)施需要多名開發(fā)人員協(xié)同工作,采用工廠方法模式,可以使功能模塊之間相對獨(dú)立,有效地避免了代碼版本沖突的問題。
(三)UML軟件系統(tǒng)過程設(shè)計(jì)
過程定義(Process Definition): 過程定義即過程建模。本功能模塊通過對Workflow(工作流模板)和Activity(活動節(jié)點(diǎn))對象的操作,成功實(shí)現(xiàn)了過程定義、過程管理的功能[4]。
過程定義——新建一個業(yè)務(wù)過程時(shí):
首先,創(chuàng)建一個新的Workflow 對象,定義業(yè)務(wù)過程名稱、標(biāo)識符等信息,每個Workflow 實(shí)例相當(dāng)于一個業(yè)務(wù)過程實(shí)例(Process)的模板。
其次,為新業(yè)務(wù)過程創(chuàng)建并添加新的Activity,Activity 即是工作流程中的一個邏輯節(jié)點(diǎn)。在Activity 中,定義該節(jié)點(diǎn)是否為起始節(jié)點(diǎn)或者終止節(jié)點(diǎn);定義該節(jié)點(diǎn)的當(dāng)前狀態(tài)、順序操作狀態(tài)、駁回狀態(tài),以及節(jié)點(diǎn)的上級節(jié)點(diǎn)與下級節(jié)點(diǎn);并定義在當(dāng)前節(jié)點(diǎn)上的流程操作(e.g.:順序操作、駁回操作,或者并行操作等)Process 和Task 分別作為Workflow 與Activity 的實(shí)例。當(dāng)一個實(shí)例流程被發(fā)起時(shí),系統(tǒng)根據(jù)對應(yīng)的流程模板,創(chuàng)建相應(yīng)的Process 和Task 實(shí)例。過程編輯——修改一個已有的業(yè)務(wù)流程時(shí),只需要更改相對應(yīng)的流程對象與它的邏輯節(jié)點(diǎn)對象的相關(guān)信息即可。除非要為流程設(shè)定默認(rèn)任務(wù)處理角色,否則任務(wù)分配不會在過程定義中進(jìn)行。
三、UML軟件系統(tǒng)模型設(shè)計(jì)
(一)單例模型設(shè)計(jì)
軟件設(shè)計(jì)中,單例模式是確保類只生成一個實(shí)例對象的一種模式。這是一種十分有用的設(shè)計(jì)模式,如果在系統(tǒng)中只能有一個對象出現(xiàn)時(shí),單例模式可以很好地發(fā)揮作用。這種模式對于某些系統(tǒng)來說,效率是很高的,因?yàn)橄拗屏藢ο笊傻膫€數(shù),系統(tǒng)的開銷大大降低了。一些人認(rèn)為這是一種不符合設(shè)計(jì)模式思想的設(shè)計(jì)方法,認(rèn)為這種用法完全沒必要,它只是增加了一些沒必要了限制,完全可以使用全局變量來代替[5]。然而經(jīng)過多年實(shí)踐的考驗(yàn),這種模式的確給編程帶來了極大的方便,在Java 的JDK 實(shí)現(xiàn)中也多處使用了單例模式來實(shí)現(xiàn),比如:Calendar類,java.lang.Runtime 類等。
單例模式的實(shí)現(xiàn)必須滿足,只生成一個實(shí)例并且是可以全局訪問的。這就需要一種機(jī)制來保證其他的類不能創(chuàng)建該類的實(shí)例,其訪問方式也不能通過創(chuàng)建對象的方式來訪問。對于這兩點(diǎn)限制,可以通過創(chuàng)建一個靜態(tài)實(shí)例的方法和限制構(gòu)造方法為私有的方式來實(shí)現(xiàn)。因?yàn)槊恳粋€類中靜態(tài)變量在內(nèi)存中的實(shí)例只有一個,另外構(gòu)造方法為私有的,并且自己構(gòu)造了自己的實(shí)例,其他的類沒有權(quán)限調(diào)用其構(gòu)造方法創(chuàng)建實(shí)例,這樣就實(shí)現(xiàn)了單例模式。
單例和類中靜態(tài)實(shí)例成員經(jīng)常容易被人們混淆,下面闡述一下這兩者的區(qū)別。類中的靜態(tài)實(shí)例成員,是類的靜態(tài)成員,使用static 修飾符修飾,在類對象實(shí)例化時(shí),靜態(tài)成員被初始化,一個類實(shí)例只對應(yīng)一個靜態(tài)成員。多個類實(shí)例會對應(yīng)多個不同的靜態(tài)成員。而單例只會有一個實(shí)例,其中的靜態(tài)成員也理所當(dāng)然只有一個。
如果是多線程訪問單例時(shí),需要十分小心。當(dāng)兩個線程同時(shí)調(diào)用其生成實(shí)例的方法創(chuàng)建實(shí)例對象,他們都需要檢查單例是否已經(jīng)存在,并且只有一個能夠創(chuàng)建新的實(shí)例。這就要求在多并發(fā)處理時(shí),應(yīng)該使用互斥訪問的機(jī)制來創(chuàng)建實(shí)例。一個比較傳統(tǒng)的方式就是在類上使用互斥機(jī)制,來表明對象正在被實(shí)例化。Java 語言提供了多種多線程安全訪問單例的方法,對于不同的Java 版本,實(shí)現(xiàn)的方式也不一樣,從Java5.0 開始,最簡單的方式是使用enum 類型的方法,后面會對其進(jìn)行說明。傳統(tǒng)的多線程安全的解決方式不需要語言結(jié)構(gòu)的支持,但是這種方式不能實(shí)現(xiàn)懶加載。
很多專家提出的雙檢鎖機(jī)制,曾經(jīng)一度被認(rèn)為是解決單例多線程安全問題的最好方法,而被廣泛地使用。后來推翻了雙檢鎖策略,指出其在Java語言中是不能使用雙檢鎖來解決多線程安全問題。對于雙檢鎖的單例實(shí)現(xiàn),本文就不贅述,下面介紹一種簡單的單例實(shí)現(xiàn)方式,是Joshua Bloch 推薦的一種方式,代碼如下:
public enum Singleton {INSTANCE;//唯一實(shí)例
public static Singleton getInstance(){return INSTANCE;}
使用enum 來實(shí)現(xiàn)單例的好處很明顯,簡潔并且無償提供了序列化,即使是在面對復(fù)雜的序列化或者反射攻擊的時(shí)候,也能絕對防止多次實(shí)例化。
(二) UML系統(tǒng)服務(wù)框架設(shè)計(jì)
數(shù)據(jù)層地應(yīng)用集成(data-level):簡單來說,可以把各種不同的數(shù)據(jù)進(jìn)行存儲并且實(shí)現(xiàn)有效的移動。一般情況下就是將信息從源數(shù)據(jù)庫中抽取出來,進(jìn)行需要的格式轉(zhuǎn)換,并對目標(biāo)數(shù)據(jù)庫進(jìn)行更新。在對所有的數(shù)據(jù)進(jìn)行集成的過程中,其最大優(yōu)勢在于付出的多少,對數(shù)據(jù)進(jìn)行集成并不需要對所有的代碼進(jìn)行更換,只需要對代碼進(jìn)行開發(fā):測試和重新部署。通常將數(shù)據(jù)集成看作其他集成技術(shù)與手段的基礎(chǔ)。
應(yīng)用程序接口層地應(yīng)用集成(application-interface level):將應(yīng)用程序的內(nèi)部接口暴露出來,作為集成開發(fā)者可以有效地利用這些不同的接口,對所有參與系統(tǒng)相關(guān)的業(yè)務(wù)進(jìn)行處理,能夠獲取大量且簡單的信息。采用應(yīng)用程序技術(shù),開發(fā)者可以將各種不同應(yīng)用程序綁定在一處,并且將所有的程序和系統(tǒng)有效地進(jìn)行集成,確保這些信息能夠被應(yīng)用。但是這種集成方式所獲取的信息內(nèi)容取決于應(yīng)用程序所暴露接口的質(zhì)量和數(shù)量。
方法層地應(yīng)用集成(method-level):在企業(yè)的內(nèi)部業(yè)務(wù)邏輯中共享是十分重要的一個邏輯環(huán)節(jié),目前很多企業(yè)都在選擇共享的方式進(jìn)行經(jīng)營管理。而在企業(yè)發(fā)展的過程中,各類不同的共享方法層出不窮,其中包括了:分布式對象、業(yè)務(wù)處理監(jiān)控、應(yīng)用服務(wù)器、框架等等。在這樣的過程中,選擇共享的模式不僅僅是創(chuàng)建某一個應(yīng)用程序,而是需要兩個或多個以上的程序,才能提高應(yīng)用集成的效果。當(dāng)前在企業(yè)共存應(yīng)用過程中,有兩種不同的方式:第一,基于同一個共享物理器上進(jìn)行應(yīng)用程序的創(chuàng)建。第二,在企業(yè)中可以將共享放在應(yīng)用程序之中,使得在應(yīng)用程序之內(nèi)的用戶變成分布對象,比如SOA。
用戶界面層地應(yīng)用集成(user-interface level):是把用戶界面作為整個應(yīng)用過程中各個不同界面最為重要的公共點(diǎn),其目的是通過這種方式,將各個不同的系統(tǒng)集成在一起。是一種相對原始,但十分必要的集成方法。界面集成不涉及軟件系統(tǒng)的數(shù)據(jù)和功能這兩個方面。至少能夠在用戶使用角度產(chǎn)生一個“整體”的概念。用戶界面集成的特點(diǎn):技術(shù)難度不大,更多地需要考慮用戶的感觀和使用習(xí)慣。一般應(yīng)用集成必須要做的集成方式。
四、服務(wù)模型創(chuàng)建與接口實(shí)現(xiàn)
1. 服務(wù)的創(chuàng)建:創(chuàng)建服務(wù)分為兩種情況,分別是對原有業(yè)務(wù)進(jìn)行封裝暴露成服務(wù),以及新建服務(wù)。而服務(wù)具體的實(shí)現(xiàn)是采用WebServices技術(shù)對業(yè)務(wù)代碼進(jìn)行封裝。
2. 服務(wù)的描述:服務(wù)創(chuàng)建后,調(diào)用者如何獲得相應(yīng)的服務(wù),需要獲取服務(wù)的相關(guān)描述信息。為用戶提供詳細(xì)的接口說明書。
參? 考? 文? 獻(xiàn)
[1] 于麗.基于UML的面向?qū)ο蠼<夹g(shù)研究與應(yīng)用[J].信息與電腦(理論版),2015(20):16-17.
[2] 唐貽興. 基于web的高校資產(chǎn)管理系統(tǒng)設(shè)計(jì)[J]. 安徽建筑工業(yè)學(xué)院學(xué)報(bào)(自然科學(xué)版), 2008,(02),17-18 .
[3] 陳佳,吳安青,張建華,劉連忠.基于國際通用流程建模標(biāo)準(zhǔn)的高校儀器設(shè)備管理流程[J].實(shí)驗(yàn)室研究與探索,2018,v.37;No.272(10):297-300.
[4] 謝振超. 基于無標(biāo)志物的虛擬家居布置系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].重慶郵電大學(xué),2018.
[4] 皇威,曾蘊(yùn)波,謝政.基于SOA構(gòu)建集成化企業(yè)應(yīng)用門戶[J].中國制造業(yè)信息化, 2010,39(05):15-18+23.
作者單位:孫志明? ? 江蘇省淮陰商業(yè)學(xué)校