UML類圖(上):類、繼承和實現


UML類圖(上):類、繼承和實現


面向對象設計

對於一個程序員來說,在工作的開始階段通常都是別人把東西設計好,你來做。伴隨着個人的成長,這個過程將慢慢變成自己設計一部分功能來實現,自己實現。如果要自己設計,無論是給自己看,還是給別人看,勢必要輸出一些文檔,清晰地整理出思路。

關於文檔,有些人會用文字,但是再多的文字在絕大多數人看來,都不會有一張圖來得直白,本文就講一講使用UML圖來進行面向對象的設計。

面向對象設計主要就是使用UML的類圖,類圖用於描述系統中所包含的類以及它們之間的相互關系,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據

UML類圖分為上下兩篇,上篇是類、繼承和實現三種關系,下面開始。

 

類的UML畫法

Java是一門面向對象語言,那最基礎的就類了。類(Class)封裝了數據和行為,是面向對象的重要組成部分,它是具有相同屬性、操作、關系的對象集合的總稱。在系統中,每個類都具有一定的職責,職責指的是類要完成什么樣子的功能,要承擔什么樣子的義務。一個類可以有多種職責,但是設計得好的類一般只有一種職責。

假如我現在定義了這么一個類:

復制代碼
public class Person 
{
private String name = "Jack"; public String getName()
{
return name; } public void setName(String name)
{
this.name = name; } protected void playBasketball()
{ pass(); }
private void pass()
{
} }
復制代碼

那么此類對應的UML為:

看到該圖分為三層:最頂層的為類名,中間層的為屬性,最底層的為方法。

屬性的表示方式為:【可見性】【屬性名稱】:【類型】={缺省值,可選}

方法的表示方式為:【可見性】【方法名稱】(【參數列表】):【類型】 

可見性都是一樣的,"-"表示private、"+"表示public、"#"表示protected

 

繼承關系

繼承也叫作泛化(Generalization),用於描述父子類之間的關系,父類又稱為基類或者超類,子類又稱作派生類。在UML中,泛化關系用帶空心三角形的實線來表示。

假如現在我又定義了一個Student和一個Teacher:

復制代碼
public class Student extends Person 
{
private String studentNo; public void study()
{
} }
復制代碼
復制代碼
public class Teacher extends Person 
{
private String teacherNo; public void teach()
{
} }

復制代碼

那么,用UML表示這種關系應當是:

 

抽象繼承關系

上面的繼承是普通的繼承,在Java中,除了普通的繼承之外,眾所周知的還有一種抽象的繼承關系,因此就再講講抽象繼承關系,作為上面的繼承的補充。

比方說我想實現一個鏈表(Link),插入(insert)與刪除(remove)動作我想讓子類去實現,鏈表本身只實現統計鏈表中元素個數的動作(count),然后有一個子類單向鏈表(OneWayLink)去實現父類沒有實現的動作,Java代碼為:

復制代碼
public abstract class Link
{
    public abstract void insert();
    public abstract void remove();
    
    public int count()
    {
        return 0;
    }
}
復制代碼
復制代碼
public class OneWayLink extends Link
{
    public void insert()
    {
        
    }

    public void remove()
    {
        
    }
}
復制代碼

其UML的畫法為:

在UML中,抽象類無論類名還是抽象方法名,都以斜體的方式表示,因為這也是一種繼承關系,所以子類與父類通過帶空心三角形的實線來聯系。注意:子類中覆蓋了父類的abstract方法,方法名再次出現。

 

實現關系

很多面向對象的語言中都引入了接口的概念,如Java、C#等,在接口中通常沒有屬性,而且所有的操作都是抽象的,只有操作的聲明沒有操作的實現。UML中用與類類似的方法表示接口,假設我有一個Animal:

public interface Animal 
{
public void move(); public void eat(); }

那么它的UML應當表示為:

很簡單,注意在方法上應當有<<interface>>表示這是一個接口。接口一般沒有屬性,所以這里中間層沒有,有屬性要注意也都是常量。

接下來,有一個Dog和一個Cat實現了Animal:

復制代碼
public class Dog implements Animal 
{
public void move()
{ }
public void eat()
{ } }
復制代碼
復制代碼
public class Cat implements Animal 
{
public void move()
{ }
public void eat()
{ } }
復制代碼

此時應當使用帶空心三角形的虛線來表示,UML應該是這樣的:

兩個抽象方法,Dog和Cat的實現將不一樣,當然,在Dog和Cat之中,也可以增加Dog和Cat自己的變量和方法。

 

================================================================================== 

我不能保證寫的每個地方都是對的,但是至少能保證不復制、不黏貼,保證每一句話、每一行代碼都經過了認真的推敲、仔細的斟酌。每一篇文章的背后,希望都能看到自己對於技術、對於生活的態度。

我相信喬布斯說的,只有那些瘋狂到認為自己可以改變世界的人才能真正地改變世界。面對壓力,我可以挑燈夜戰、不眠不休;面對困難,我願意迎難而上、永不退縮。

其實我想說的是,我只是一個程序員,這就是我現在純粹人生的全部。

==================================================================================

文章內容轉載自:  http://www.cnblogs.com/xrq730/p/5527115.html ,我做了很少的修改,這些修改都是我自己對問題的理解。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM