1 UML基礎

来源:http://www.cnblogs.com/zhixin9001/archive/2016/08/07/5747527.html
-Advertisement-
Play Games

學習設計模式的過程中,發現相關的作者們都會用UML類圖來表示一個模式的整體脈絡,這種方式確實直觀明瞭,既能體現巨集觀思路、又能兼顧實現細節。真的是很妙的工具。在開始正式學習設計模式之前,有必要對UML有個大概的掌握。然後,日後有望解鎖更多關於UML方面的技能,比如說:建模。哈哈,有點小興奮呢。 UML ...


  學習設計模式的過程中,發現相關的作者們都會用UML類圖來表示一個模式的整體脈絡,這種方式確實直觀明瞭,既能體現巨集觀思路、又能兼顧實現細節。真的是很妙的工具。在開始正式學習設計模式之前,有必要對UML有個大概的掌握。然後,日後有望解鎖更多關於UML方面的技能,比如說:建模。哈哈,有點小興奮呢。

  UML全稱Unified Modeling Language(統一\標準建模語言),旨在為軟體開發提供可視化、模型化的工具。可見,UML既是一種建模工具,也是一種“交流語言”。

 

一、UML類圖的基本元素

1 類的結構

  UML用內含三層“格子”的矩形框表示類,如圖:

  

  最上層為類的名稱;中間為類的欄位和屬性;最下層為類的行為和方法。

  如果為抽象類,類名用斜體標識。

2 訪問修飾符

  public、private、protected分別用  +  -  # 來表示

  至於C#中的 internal、protected internal修飾符,則沒有對應的符號。(UML是通用的標記語言,而後兩種修飾符屬C#等少數語言)

3 介面表示

  有兩種方法矩形表示法和棒棒糖表示法(截圖來自《大話設計模式》)

  

 

二、 相互關係

  UML類圖中,類與類、介面與類之間的關係一共有泛化(Generalize)、實現(Realization)、依賴(Dependency)、關聯(Association)、聚合(Aggregation)、組合(Composition)六種。這幾種表示的相互作用關係依次加強。

1 泛化(Generalize)

  泛化即子類、子介面繼承父類、父介面的功能,並能擴張自己新的功能的能力,是一種 is-a(一般與特殊)的關係。貓繼承了動物,那麼就可以說貓是動物的泛化,貓 is a 動物。

  UML用空心的三角箭頭+實線來表示泛化或繼承。

  

2 實現(Realization)

  即類實現介面的功能。

  對於矩形表示法,用空心三角箭頭加虛線表示;對於棒棒糖表示法,則把棒棒糖直接插在實現介面的類上(JUDE的棒棒糖不太好看)。

  

 

3 依賴(Dependency)

  一個類依賴另一個類的定義。比如人需要用手機打電話,那麼人依賴手機。依賴關係總是單向的。依賴具有偶然性、臨時性,且關係非常弱。依賴在具體的代碼層面,表現為(類A依賴類B):

  類B作為參數被類A使用;

  類B以局部變數的形式存在於類A的方法中;

  類A調用類B的靜態方法。

  UML中用簡單箭頭加虛線表示依賴:

  

4 關聯(Association)

  一個類需要知道另一個類的狀態(屬性、方法)。關聯體現的是類與類或介面之間的強依賴關係,相比於依賴關係,這種關係是長期性的,而且雙方的關係一般是平等的。在代碼層面(A關聯B),B以類屬性的形式出來在A中,或A引用了一個類型為B的全局變數。

  UML中,用簡單實線箭頭表示單向關聯,用雙箭頭或不使用箭頭表示雙向關聯。但為了降低耦合,雙向關聯不建議使用。

  關聯箭頭的頭和尾都可以添加基數標識,用來表示有幾個實例。

  

5 聚合(Aggregation)

  關聯關係的一種特例,是強的關聯關係,也是一種是整體和個體的關係(has-a)。普通的關聯關係的兩個類處於同一層級,但聚合關係的兩個類處於不同層級,比如公司和員工。同時這又是一種弱的擁有(has-a)關係。因為整體和個體之間是可分離的,他們有各自獨立的生命周期。個體可以屬於多個整體,也可以被多個整體共用。關於在代碼層面的的實現,沒有特定的標準,最可靠的識別方法為通過語義。如下為一種實現了聚合的代碼:

  public class Company

  {

    List<Employee> list;

  }

  

  UML中使用空心菱形加實線來表示

  

6 組合\結合(Composition)

  組合也屬與關聯的特例,是比聚合更強的關聯關係,而且整體與部分的生命周期一致(contains-a)。比如胳膊與人體。如下為一種代碼實現:

  public class Body

  {

    private Arm arm;

    public Body()

    {

      arm=new Arm();

    }

  }

  

  UML中用實心菱形加實線來表示

  

 

三、總結

  六種關係的關聯程式從低到高為:泛化<實現<依賴<關聯<聚合<組合

  泛化為is-a關係,關聯為has-a關係,其中,聚合、組合為關聯的特例,組合代表的關係最為緊密,是一種contains-a關係

  聚合與組合的區別:

    1)主要體現在關係成員的生命周期是否相同;

    2)被聚合的類,還可以繼續被其他類聚合;但被組合的類則不能再屬於其他類。

  關聯和聚合的區別:

    主要的差別在於抽象層級,關聯在同一抽象層級,聚合在不同層級。

  

  關於UML,目前就學這點皮毛吧。

  

 

 

  

 

 

 

 

  

 

 

 

 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • volatile 的特性 當我們聲明共用變數為 volatile 後,對這個變數的讀/寫將會很特別。理解 volatile 特性的一個好方法是:把對 volatile 變數的單個讀/寫,看成是使用同一個鎖對這些單個讀/寫操作做了同步。下麵我們通過具體的示例來說明,請看下麵的示例代碼: 假設有多個線程 ...
  • 1.開通語音識別(預設關閉) 2.語音識別 請註意,開通語音識別後,用戶每次發送語音給公眾號時,微信會在推送的語音消息XML數據包中,增加一個Recognition欄位(註:由於客戶端緩存,開發者開啟或者關閉語音識別功能,對新關註者立刻生效,對已關註用戶需要24小時生效。開發者可以重新關註此帳號進行 ...
  • 學習Hibernate ,我們首先要知道為什麼要學習它?它有什麼好處?也就是我們為什麼要學習框架技術? 還要知道 什麼是Hibernate? 為什麼要使用Hibernate? Hibernate的配置文件的作用是什麼? Hibernate映射文件的作用是什麼? Hibernate持久化對象的狀態有哪 ...
  • nodejs windows下的調用方法: C:\Users\owen>node helloworld.jsHello WorldHello: 25 C:\Users\owen>node getmodule.jsHello BYVoid C:\Users\owen>node app.jsHTTP S ...
  • 在Eclipse 創建動態WEB 工程,在src 下 創建 config.xml: 提示Error: Content is not allowed in prolog 查看為DOM 解析xml error, 查看網上加入 dom4j.jar,refrensh並無效果; // 解決辦法: 用記事本創建 ...
  • 實例運行結果如下 實例運行結果如下 ...
  • 今天寫了個java類連接oracle,拋出了這個問題 java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:@127.0.0.1:1521:orcl; 很顯然是URL錯誤,以前碰到過類似的問題,故一起總結一下。 以前 ...
  • 前言:關於EL表示式開發用的非常多,現在我們回顧一下關於如果去操作EL表達式 1:EL表達式語法 所有EL表達式都是由{開始}結束,表達式中用.和[]操作符來訪問數據比喻${user.userName}、${user["userName"]}是等效的。 2:幾個重要的操作符 算術,邏輯,關係操作符和 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...