Python設計模式 - UML - 包圖(Package Diagram)
簡介
包圖是對各個包及包之間關系的描述,展現系統中模塊與模塊之間的依賴關系。一個包圖可以由任何一種UML圖組成,可容納的元素有類、接口、組件、用例和其他包等。包是UML中非常常用的元素,主要作用是分類、容納其他元素。包與包之間的關系有泛化、細化和依賴,主要取決於包內部成員之間的關系。
包圖建模步驟
- 分析系統的模型元素,運用分層設計把概念、語義和邏輯上相近的元素包含在同一個包中
- 對於每個包,分析包內每個元素的可訪問屬性,並標識出該元素的可見性
- 確定包與包中元素之間的泛化、細化、依賴關系,相應處理重載、多重性及導入等關系
- 分析包結構,對包進行refine, merge等操作
包圖中的元素
包圖中可以容納很多元素,如類、接口、組件、註釋等,這些元素在相應的UML圖中都有涉及,這裏主要介紹包元素。
- 包名的位置:UML中使用文件夾的圖標來表示包,包名可以放在第一欄,也可以放在第二欄
放在第一欄
放在第二欄
- 包名的格式:每個包都有一個字符串格式的包名唯一標識該包,其中包名的格式有兩種:
- 簡單包名
- 帶路徑包名
- 可見性
‘+‘: public:對所有包可見
‘-‘: private:對本包之外不可見
‘#‘: protected:對本包的子包可見
- 傳遞性:包與包之間的關系和可見性具有具有傳遞性
- 關系傳遞:如果包A和包B之間存在關系,包B和包C之間存在關系,那麽包A和包C之間也存在關系
- 可見性傳遞:根據包與包之間依賴關系的不同傳遞可見性
- <<import>>因為添加為公有元素的原因所以可見性可以傳遞
- <<access>>的可見性由於添加為私有元素的原因可見性不可傳遞
- 構造特性:和類的構造性相似,就是在包名關鍵字旁加入<<xxx>>作為補充說明,UML提供了5種構造型來描述包的特性
- <<system>>: 表示該包代表一個系統
- <<subsystem>>: 表示該包代表一個子系統
- <<facade>>: 表示該包是由其他包構成的一個視圖
- <<stub>>: 表示該包是一個代理包,該代理包為其他包提供公共服務
- <<framework>>:表示該包代表一個框架
包圖類的關系
- 泛化:繼承關系,跟類之間的泛化關系相似,表明是一個包家族
- 細化:一個包中有另一個包中的所有元素,則第二個包是第一個包的細化
- 依賴:一個包中引用到了另一個包,箭頭從輸入方包指向輸出方包
<<use>>:一種默認的包依賴關系,表示客戶包中的元素以某種方式使用著提供者包中的公共元素
<<import>>:最普遍的包依賴關系,表示提供者包中的公共元素被添加為客戶包中的公共元素
<<access>>:表示提供者包中的公共元素被添加為客戶包中的私有元素
<<merge>>:表示提供者包中的元素被擴展為客戶包中的元素
<<trace>>:表示一個包的歷史版本發展為另一個包的進化版本
包圖的高級特性
- 分層:根據職責分層,目的是為了解耦。雙向箭頭表示相互依賴。
- 嵌套:包裏面是可以有包的。但應盡量避免使用多層嵌套包,2-3層就好
包圖示例
以書店在線訂購系統為例
包圖的註意事項
- 若包被撤銷,則其中的元素也會被撤銷掉
- 合理最小化包之間的依賴
- 合理最小化每個包中public, protected元素的個數及最大化private元素個數
- 避免包之間的循環依賴
- 根據類之間的依賴關系對包進行分層、分組、合並、細化
- 包之間關系遵循高內聚、低耦合的特性
Python設計模式 - UML - 包圖(Package Diagram)