從零開始單排學設計模式「UML類圖」定級賽

来源:https://www.cnblogs.com/gdjk/archive/2019/02/01/10346104.html
-Advertisement-
Play Games

閱讀本文大概需要 3.5 分鐘。 本篇是設計模式系列的開篇,雖然之前也寫過相應的文章,但是因為種種原因後來斷掉了,而且發現之前寫的內容也很渣,不夠系統。 所以現在打算重寫,加上距離現在也有一段時間了,也算是自己的一個回顧吧! 學而時習之,不亦說乎。 從零開始單排學設計模式的國服排位之旅,今天正式開啟 ...


閱讀本文大概需要 3.5 分鐘。

本篇是設計模式系列的開篇,雖然之前也寫過相應的文章,但是因為種種原因後來斷掉了,而且發現之前寫的內容也很渣,不夠系統。

所以現在打算重寫,加上距離現在也有一段時間了,也算是自己的一個回顧吧!

學而時習之,不亦說乎。

從零開始單排學設計模式的國服排位之旅,今天正式開啟!

目前段位:定級賽

 

這篇文章來總結下UML類圖,本來不打算講UML類圖的,因為我在學習設計模式的時候,一遇到有關UML的就會自動忽略,一看感覺就很複雜。

但是隨著學習的深入,發現不掌握UML類圖,對設計模式或者某一個框架沒有整體的把控。所以與其逃避,不如敢於面對,今天就讓我們一起來瞭解下什麼是UML類圖。

Let's Go!

前言

 

設計模式不是語法,是一種巧妙的寫法,能把程式變的更加靈活。架構模式比設計模式大,架構模式是戰略,而設計模式是戰術。

設計模式分為3大類型:創建型,行為型,結構型,總共有23種。

UML類圖

 

類圖描述系統中類的靜態結構,它不僅定義系統中的類,描述類之間的聯繫,如關聯、依賴、聚合等,還包括類的內部結構(類的屬性和操作)。

類圖描述的是靜態關係,在系統的整個生命周期中都是有效的。

對象圖是類圖的實例,它們的不同之處在於對象圖顯示類圖的多個對象實例,而不是實際的類。由於對象存在生命周期,所以對象圖只能在系統某一時間存在。

UML基本圖示法

 

虛線箭頭指向依賴;

實線箭頭指向關聯;

虛線三角指向介面;

實線三角指向父類;

空心菱形能分離而獨立存在,是聚合;

實心菱形精密關聯不可分,是組合;

上面是UML的語法,在畫類圖的時候,清理類和類之間的關係是重點。

類的關係有泛化(Generalization)、實現(Realization)、依賴(Dependency)和關聯(Association)。

其中關聯又分為一般關聯關係和聚合關係(Aggregation),合成關係(Composition)。

基本概念

類圖(Class Diagram):類圖是面向對象系統建模中最常見和最重要的圖,是定義其他圖的基礎。

類圖的主要是用來顯示系統中的類、介面以及它們之間的靜態結構和關係的一種靜態模型。

類圖的3個基本組件:類名、屬性、方法。

詳細解析

註:下麵圖片實例中的代碼為C#代碼,非Java代碼!

繼承關係

 

首先看到上圖這個“動物”矩形框,它就代表一個類(Class)。

類圖分三層

第一層顯示類的名稱,如果是抽象類,則就用斜體顯示。

第二層是類的特性,通常就是欄位和屬性。

第三層是類的操作,通常是方法或行為。

 

在看到上圖中的“飛翔”,它表示一個介面圖,與類圖的區別主要是頂端有<<interface>>顯示。

第一行是介面名稱,第二行是介面方法。

介面還有另一種表示方法,俗稱棒棒糖表示法,就是唐老鴨類實現了“講人話”的介面。

鴨子本來也有語言,只不過只有唐老鴨是能講人話的鴨子。

註意動物、鳥、鴨、唐老鴨之間的關係符號,你就會發現它們都是繼承的關係。

 

繼承關係用空心三角形+實現來表示。

這裡列舉的幾種鳥中,大雁是最能飛的,我讓它實現了飛翔介面。

 

實現介面用空心三角形+虛線來表示。

在看下圖中企鵝和氣候兩個類,企鵝是很特別的鳥,會游不會飛。更重要的是,它與氣候有很大的關聯。我們不去討論為什麼北極沒有企鵝,為什麼它們要每年長途跋涉。

 

總之,企鵝需要“知道”氣候的變化,需要“瞭解”氣候規律。

當一個類“知道”另一個類時,可以用關聯(association)。

關聯關係用實現箭頭來表示。

 

我們再來看上圖中大眼與雁群這兩個類,大雁是群居動物,每隻大雁都屬於一個雁群,一個雁群可以又很多只大雁。

所以它們之間就滿足聚合(Aggregation)關係。

聚合表示一種弱的“擁有”關係,體現的是A對象可以包含B對象,但B對象不是A對象的一部分。

聚合關係用實心的菱形+實線箭頭來表示。

 

合成(Composition,也有翻譯成“組合”的)是一種強的“擁有”關係,體現了嚴格的部分和整體的關係,部分和整體的聲明周期一樣。

在這裡鳥和其翅膀就是合成(組合)關係,因為它們是部分和整體的關係,並且翅膀和鳥的聲明周期是相同的。

合成關係用實心的菱形+實現箭頭來表示。

另外,你會註意到合成關係的連線兩端還有一個數字“1”和數字“2”,這被稱為基數。表明這一段的類可以有幾個實例,很顯然,一個鳥應該有兩隻翅膀。

如果一個類可能有無數個實例,則就用“n”來表示。關聯關係、聚合關係也可以有基數的。

 

動物幾大特征,比如有新陳代謝,能繁殖。而動物要有生命力,需要氧氣、水以及食物等。也就是說,動物依賴於氧氣和水。

他們之間是依賴關係(Dependency),用虛線箭頭來表示。

結語

 

編程是一門技術,更加是一門藝術!

不能只滿足於寫完代碼運行結構正確就完事,時常考慮如何讓代碼更加簡練,更加容易維護,容易擴展和復用,只有這樣才能可以真正得到提高。

切身感悟:自己幾個月之前寫完的代碼,現在再來回顧,你會發現這代碼簡直了...,一團糟,甚至懷疑這代碼不是出自自己之手(絕對是自己寫的)。想著手優化,進行改進,又怕本來沒問題的功能,改出問題,影響使用,然後又進入惡性迴圈了。。。這種情況要切記,一定要儘可能的避免!

寫出優雅的代碼也是一種很爽的事情!!!

 

 

 


往期精彩回顧

房東:你敢申報,我就漲房租!京東取消年終獎!

一千行MySQL詳細學習筆記(值得學習與收藏)

你女朋友是高可用麽?

在Java中如何優雅地判空

最近整個業內狀態不太好,註意提防一些公司的小九九!

Java爬取並下載酷狗TOP500歌曲

如何計算伺服器能夠承受多大的pv?

程式員們,別再學習框架了!

專科程式員與本科程式員之間有什麼區別?

程式員的一天是怎樣過的?

從 0 開始手寫一個Tomcat,7 步搞定!


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

-Advertisement-
Play Games
更多相關文章
  • 面對日新月異的前端,我表示快學不動了
  • 用戶登錄的驗證可以使用 form 表單提交,也可以使用 ajax 技術非同步提交。 AJAX 即 Asynchronous Javascript And XML(非同步 JavaScript 和 XML),是一種用於創建快速動態網頁的技術。 通過在後臺與伺服器進行少量數據交換,AJAX 可以使網頁實現異 ...
  • 又到了大家最喜歡的項目練習階段,學以致用,今天我們要用前幾篇的學習內容實現列表的添加與刪除。 學前準備: ①:JavaScript中的splice(index,i)方法:從已知數組的index下標開始,刪除i個元素。 ②:JavaScript中的findIndex() 方法:為數組中的每個元素都調用 ...
  • 第六章 類型 相等 轉換等 一、類型 1 typeof(); typeof是一個內置的JavaScript運算符,可用於探測其操作數的類型。 例: 2 undefined 說明:對於任何還沒有值(即未初始化)的東西,都會將undefined賦給它;undefined的類型是undefined 【未初 ...
  • 第五章 網頁交互——文本對象模型【Document object model】 1 簡單介紹DOM,dom是將html與javascript進行交互的工具。 【使用innerHTML時註意:html中的內容是按照HTML本身的先後順序載入的。故js對應代碼應置於html之後】 問題: *docume ...
  • 原始的調用客戶端的方式是通過註入restTemplate的方式 通過feign的方式 配置消費者項目cloud-consume pom.xml 依賴jar application.yml 添加啟動feign 可實現錯誤回調 啟動應用類 ClondConsumeApplication.java 添加註 ...
  • spring cloud分為註冊端、客戶端以及消費端 初體驗的理解就是: 註冊端就是將之前所有的應用在這邊進行註冊,然後給每個應用都生成自己的標識,這些應用就是來自於客戶端,消費端則通過調用註冊端(有點數據中心的概念)然後去調用客戶端各個的應用. 1、註冊端代碼: 直接創建maven項目: pom. ...
  • 0 前言 提前先祝大家春節快樂!好了,先簡單聊聊。 我從事的是大數據開發相關的工作,主要負責的是大數據計算這塊的內容。最近Hive集群跑任務總是會出現Thrift連接HS2相關問題,研究瞭解了下內部原理,突然來了興趣,就想著自己也實現一個RPC框架,這樣可以讓自己在設計與實現RPC框架過程中,也能從 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...