Java 大白話講解設計模式之 -- UML類圖

聲明:原創作品,轉載請註明出處https://www.jianshu.com/p/2828874af134

這篇文章來總結下UML類圖,本來不打算講UML類圖的,因爲我在學習設計模式的時候,一遇到有關UML的就會自動忽略,一看感覺就很複雜。但是隨着學習的深入,發現不掌握UML類圖,對設計模式或者某一個框架沒有整體的把控。所以與其逃避,不如敢於面對,今天就讓我們一起來了解下什麼是UML類圖。

說到UML類圖,我們先來看下什麼是UML。在維基百科上對它的定義如下:

UML即統一建模語言(Unified Modeling Language),它是一種開放的方法,用於說明、可視化、構建和編寫一個正在開發的、面向對象的、軟件密集系統的製品的開放方法。UML展現了一系列最佳工程實踐,這些最佳實踐在對大規模,複雜系統進行建模方面,特別是在軟件架構層次已經被驗證有效。

從定義上看可能有點抽象,說白了就是一種由圖表組成的標準化建模語言,一般我們理解的語言都是由文字組成,而這種統一建模語言是由圖表組成的。我們知道開發一個軟件系統,不光只有程序員參與,另外還有分析師、設計師、測試人員等等,爲了讓不同人能夠理解交流這個軟件系統,就誕生出了這麼一套語言。我們說過這個語言是有圖表組成的,這裏的圖表有好幾種類型,最常用的有:用例圖、類圖、序列圖、狀態圖、活動圖、組件圖和部署圖等。由於本文主要講解類圖,其他就不深入瞭解了,感興趣的同學可以上網搜索這方面的內容。

好了言歸正傳,我們重點看下類圖,類圖描述了我們軟件系統中類與類的關係。既然描述是類與類的關係,我們就先來看下一個類是如何表示的,再來看下他們之間的關係。首先我們定義一個非常簡單的Person類,代碼如下:

public class Person {
   private String name;
   private int age =1;

   public String getName() {
      return name;
   }
   public int getAge() {
      return age;
   }
   public void setName(String name) {
      this.name=name;
   }
   public void setAge(int age) {
      this.age=age;
   }

}

這個Person類很簡單,定義了兩個字段name和age其中age有一個初始化值1,另外定義name和age的set、get方法。很簡單,然後我們來看下這個類在UML類圖中是如何表示的:

可以看到我們畫了一個矩形,然後從上到下分割成三格,第一格爲類名,第二格爲類中字段屬性,這裏屬性的表達也是有一定格式的,如下:

   權限 屬性名:類型 [ = 默認值 ]

由於這裏我們的name和age都是私有的,所以在前面加一個-,另外還有其他幾種權限:public 、protected、default,它們分別對應+#~。由於我們這裏的age有一個默認值1,所以在類型後面再加上‘=1’來表示。接下來來看下第三格,第三格爲類的方法,其格式如下:

權限  方法名稱(參數列表) [ : 返回類型]

也很簡單,相信你一看就會,其中返回類型是可選項,這裏就不做過多的解釋了。

類之間的關係

好了,上面我們簡單瞭解了下,一個類在類圖中的表示方式,接下我們來了解下類與類的關係,類與類一共有如下幾種關係:泛化(Generalization)、實現(Realization)、依賴(Dependence)、關聯(Association)、聚合(Aggregation)、組合(Composition)。

想必大家一定聽過這麼一首兒歌:我在馬路邊撿到一分錢然後交給警察叔叔。接下來我就根據這個故事來一個一個講解下類與類之間的關係。

泛化關係

泛化關係在Java中也叫作繼承關係,在UML中我們用帶空心三角形的直線來表示,我們增加兩個類,一個Studen類,一個警察Policemen類,兩個類均繼承自Person類,那麼他們的類關係圖表示如下:


實現關係

這裏的實現關係就是Java中類與接口的實現關係,在UML中我們用帶空心三角形的虛線表示。由於Student和Policeman都職業,學生的職業就是學習,而警察的職業爲保護人民。所有這裏我們定義一個接口,裏面有一個職業的方法:

public interface ICareer{
    void career();
}

這個接口用UML類圖表示如下:


可以看到在接口名字上多了一個<<interfac>>字符來表示這個爲接口。接下來我們讓Student和Policeman都實現這個接口,UML類圖如下:

依賴關係

依賴關係是一種很弱的關係,一般是指一個類使用另一個類,這裏學生撿到錢交給警察叔叔,學生和警察叔叔就是一種依賴關係。因爲學生撿到錢給警察是一種偶然的事情,交給警察後他們之間就沒有關係了。我們在學生類中加入一個交錢的方法,在警察類中加入一個收錢的方法,當調用學生的交錢方法時,就調用警察的收錢方法。Student的代碼如下:

public class Student{
....
....
public Policemen policemen;

.....
public void sendCoin(){
    policemen.receiveCoin();
}
}

可以看到Student類中引用了Policemen類,也就是說Student依賴了Policemen,這種依賴關係我們用帶箭頭的虛線表示,箭頭指向被依賴對象,這裏也就是Policemen,UML類圖表示如下:


關聯關係

關聯關係是一種比較強的關係,他們的關係是比較持久的,穩定的。比如學生從家裏出來,學生和家就是一種關聯關係。這種關係是比較穩定的。關聯分單向關聯和雙向關聯,如果一個類知道或者引用了另一個類,而另一個類不知道或者沒有引用這個類,則這兩個類是單向關聯的。比如這裏學生與家的關係就是單向關聯的,因爲每個學生都是有個家的(不考慮孤兒),但不能說每個家裏都有學生。單向關聯我們用帶箭頭的實線表示,箭頭指向被引用或者被包含的類,這裏也就是家這個類。示例如下:


雙向關聯是兩個類彼此都知道對方的存在,比如老師與學生的關係就是雙向的。小明的語文老師是張老師,張老師的學生有小明。雙向關聯用不帶箭頭的實線來連接兩個類。示例如下:


聚合關係

聚合關係是一種特殊的關聯關係,聚合關係強調的是整體和部分的關係,其中部分可以脫離整體而存在。比如雁羣和一隻大雁的關係,就是聚合關係,大雁離開雁羣還是可以獨立存在的。再比如警察與制服的關係,制服也是警察的一部分,制服可以脫離警察而存在。在UML類圖中聚合用帶空心菱形的直線表示,其中菱形指向整體:


組合關係

組合關係也是一種特殊的關聯關係,它與聚合關係很像,也是強調整體與部分的關係,不同的是部分無法脫離整體存在。比如學生用手撿錢,其中手就是學生的一部分,但是手不能脫離學生而單獨存在。要是手能獨立存在想想就可怕。。。這裏我們稱學生與手爲組合關係,用帶實心的菱形直線表示,其中菱形指向整體:


好了,這幾種關係到這裏也就差不多了,其實你會發現,依賴、關聯、聚合、組合這幾種關係強度是越來越強的:組合>聚合>關聯>依賴。

最後,你會發現你已經不知不覺用UML類圖完成上面小學生撿錢的故事:


注:本文采用的畫圖工具爲StarUML,有需要的可以上網下一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章