1. 程式人生 > >連載:面向物件葵花寶典:思想、技巧與實踐(27)

連載:面向物件葵花寶典:思想、技巧與實踐(27)

類模型指導我們如何宣告類動態模型指導我們如何實現類

動態模型設計一般都是在類模型設計完成後才開始,因為動態模型設計的時候一般都需要用到類模型中的類。相對類模型來說,動態模型要相對簡單一些,主要原因在於動態模型設計的時候沒有什麼設計原則和設計模式需要應用,只需要對照用例模型,根據用例模型的特點,選取一個合適的動態模型將其表述出來即可。

動態模型在實際開發過程中有非常重要的作用,簡單來說,如果沒有動態模型,那麼你雖然完成了類設計,但還是不能編碼,或者只能編寫類的宣告程式碼(類屬性、方法名稱),但不能寫類的實現程式碼(方法裡面的實現邏輯,即:每個方法的實現)。動態模型就是用來指導我們如何編寫具體的方法的。

有的同學可能會有疑問:那些地方要進行動態模型設計呢

還是那句老話,你覺得比較複雜你就設計,簡單你就不設計,總之:你需要你就設計

像我在實際開發中,基本上一個中等專案就一兩個業務設計動態模型(小專案看到需求就編碼了 :) ),其它業務看需求文件就能看出如何編碼,這也是有經驗和經驗不足的差別。

參考UML標準,常見的動態模型如下:

【狀態模型】

狀態模型主要用於描述物件的生命週期的狀態變化。通過狀態圖,我們可以瞭解到物件有哪些狀態,狀態之間如何轉換,轉換的觸發條件等。當我們發現一個物件的狀態比較複雜的時候,就需要設計物件的狀態模型。

UML中使用狀態圖來描述狀態模型

【活動模型】

活動模型主要用於描述一個工作流程或者計算流程。其關注點是在完成某項工作的過程中,系統中的哪些物件承擔了什麼樣的任務、做了什麼處理,以及這些物件之間的先後互動關係。當我們發現一個處理流程比較複雜的時候,就需要設計流程的活動模型。

UML中使用活動圖來描述活動模型

序列模型

序列模型主要用於描述物件按照時間順序組織的訊息互動過程,其關鍵特徵是強調按照“時間順序”來組織物件的互動,所以序列圖有時又稱為“時序圖”或者“順序圖”。序列模型是我們最常用的動態模型,特別適合將用例模型或者SSD轉換為系統的動態模型

UML中使用序列圖來描述序列模型

【協作模型】

協作模型主要用於描述按照物件之間的關聯來組織的訊息互動過程,其關鍵特徵是強調“物件關係”來組織物件的互動。協作模型的作用和序列模型一樣,只是強調的點不同,大部分的時候我們都是選擇“序列模型”,因為序列模型的時間順序很多時候和用例模型的步驟不謀而合。

UML中使用協助圖來描述協作模型

注意:以上模型並不是每個都必須有的,根據實際需要選擇即可

建模實踐

以上這些模型都可以從用例模型推匯出來,活動模型、序列模型、協作模型基本上都是和用例模型一一對應的,或者對應用例中的某個分支。一般情況下不推薦一個模型中包含多個分支,因為這樣會導致圖比較複雜,而且主題不突出。

狀態模型和其它模型相比要複雜一些,因為並不能從單個用例或者單個用例分支推匯出某個物件的所有狀態,而需要綜合多個用例模型,從中提取出和某個物件狀態相關的內容,再統一設計狀態模型。

用例模型推匯出動態模型是一個“分解和分配”的過程,因為在用例模型中,系統是當做一個“黑盒”來看待的,而在動態模型中,系統不再是一個黑盒,而是分解成了一個一個的類。因此我們需要將原來籠統的劃分給系統的功能和職責,進一步分解並分配給不同的類。通俗的講,動態模型就是說:為了完成系統的XXX功能, 先需要類A做任務1,然後需要類B需要做任務2,再由類C做任務3。。。。。。依次分解下去,最終就能夠實現將類串起來,相互配合,最後實現了系統的需求。

我們以POS機為例,假設我們基於買單這個用例的正常分支設計“序列模型”,則可以得到如下的“序列模型”:


有了上面這個“序列圖”,假設我們要開始寫程式碼,則基本可以按照如下偽碼的方式實現(實際的編碼肯定不會這麼簡單,但方法是一樣):

main(){

    Trade trade = new Trade();                
    Integer tradeId =trade.makeNewTrade();  //建立
    trade.addGoods();                       //增加商品
    trade.cacuMoney();                      //計算總額
    ............//省略一大段程式碼
    Receipt receipt = new Receipt();        
    receipt.print(trade);                   //列印小票
	...........//省略一大段程式碼
	trade.finish();                         //結束
}

================================================ 
轉載請註明出處:http://blog.csdn.net/yunhua_lee/article/details/24269541
================================================