設計模式之UML類圖

類圖(Class diagram)主要用於描述系統的結構化設計。類圖也是最經常使用的UML圖,用類圖能夠顯示出類、接口以及它們之間的靜態結構和關係。

0x01.類圖中的元素

1.類 Class / 接口 Interface

uml類圖

  • 第一格:表示類的名字,抽象類用斜體表示,接口在前面加<interface>
  • 第二格:表示類的屬性,前面符號表示做用於,冒號後面表示類的類型
符號 解釋
+ public
- private
# protected
~ default
下面有橫線 表示static靜態屬性
  • 第三格:表示類的行爲,同上
符號 解釋
+-#~ 同上
斜體 抽象方法
下面有橫線 表示static靜態方法
:String :後表示返回值,返回String字符串類型
無: 表示void無返回

2.UML類圖中各個類的關係

大話設計模式類圖

a).依賴關係

  • 依賴關係的定義爲:對於兩個相對獨立的對象,當一個對象負責構造另外一個對象的實例,或者依賴另外一個對象的服務時,這兩個對象之間主要體現爲依賴關係。
  • 能夠簡單的理解爲:類 A 使用到了類 B,而這種使用關係具備偶然性,臨時性,很是弱的,可是 B 類中的變化會影響到類 A,好比某個學生要用筆寫字,學生與筆的關係就是一種依賴關係,若是筆沒水了,那學生就不能寫字了(B 類的變化會影響類 A) 或者換另外一隻筆繼續寫字(臨時性體現)。
  • 使用虛線和箭頭,箭頭指向被依賴的對象
  • UML圖示

依賴關係

  • 例如上面圖中:動物的新陳代謝依賴氧氣
/**
 * 動物類
 */
public class Animal {

    /**
     * 生命
     */
    public String life;

    /**
     * 新陳代謝
     * @param oxygen 氧氣
     * @param water 水
     */
    public void metabolism(Oxygen oxygen, Water water) {

    }

    public void multiply () {

    }
}
/**
 * 水
 */
public class Water {}

/**
 * 氧氣
 */
public class Oxygen {}

b).泛化繼承關係

  • 繼承表示類與類 (或者接口與接口) 之間的父子關係。在 Java 中,用關鍵字 extends 表示繼承關係。
  • 空心箭頭實線,箭頭方向是子類指向父類來表示,只有知道對方信息才能指向對方
  • UML圖示

繼承關係

  • 如圖所示:鳥類屬於動物類(鳥是動物),因此鳥繼承自動物。繼承了動物的新陳代謝和繁衍,同時也有本身的屬性(翅膀)、行爲(生蛋)。
public class Animal {
    /**
     * 生命
     */
    public String life;

    /**
     * 新陳代謝
     * @param oxygen 氧氣
     * @param water 水
     */
    public void metabolism(Oxygen oxygen, Water water) {

    }

    public void multiply () {

    }
}
/**
 * 鳥
 */
public class Bird extends Animal {
    /**
     * 羽毛
     */
    public String plume;

    /**
     * 兩個翅膀
     */
    public List<Wing> wings;

    /**
     * 生蛋
     */
    public void rawEgg () {

    }
}

c).組合關係

  • 組合是一種耦合度更強的關聯關係。存在組合關係的類表示「總體-部分」的關聯關係,「總體」負責「部分」的生命週期,他們之間是共生共死的;而且「部分」單獨存在時沒有任何意義。
  • 使用實心菱形和大於箭頭表示,實線說明耦合性更強。組合關係能夠在兩側寫上數字,表示數量對應關係。組合關係對象擁有一樣的生命週期。
  • UML圖示

組合關係

  • 如圖所示:一隻鳥有兩個翅膀,失去了鳥,翅膀也沒有存在的意義,因此鳥和翅膀是共同的生命週期。
/**
 * 鳥
 */
public class Bird extends Animal {

    /**
     * 羽毛
     */
    public String plume;

    /**
     * 兩個翅膀
     */
    public List<Wing> wings;

    /**
     * 生蛋
     */
    public void rawEgg () {

    }
}
/**
 * 翅膀
 */
public class Wing {}

d).關聯關係

  • 關聯關係的定義爲:對於兩個相對獨立的對象,當一個對象的實例與另外一個對象的一些特定實例存在固定的對應關係時,這兩個對象之間爲關聯關係。
  • 它體現的兩個類中一種強依賴關係,好比我和個人朋友,這種關係比依賴更強,不存在依賴關係中的偶然性,關係也不是臨時的,通常是長期性的。
  • 關聯關係分爲單向關聯和雙向關聯:html

    1. 在 Java 中,單向關聯表現爲:類 A 當中使用了 類 B,其中類 B 是做爲類 A 的成員變量。
    2. 雙向關聯表現爲: 類 A 當中使用類 B 做爲成員變量,同時類 B 中也使用了類 A 做爲成員變量。
  • 表示一個類和另一個類是有關聯的,通常有一個屬性是另外一個類,用實線和大於箭頭,指向被關聯對象,使用實線說明依賴性比較強。
  • UML圖示

關聯關係

  • 如圖所示:企鵝的生存依賴氣候的變化。
/**
 * 企鵝
 */
public class Penguin extends Bird {

    //氣候
    public Climate climate;

    public Climate getClimate() {
        return climate;
    }

    public void setClimate(Climate climate) {
        this.climate = climate;
    }
}
/**
 * 氣候
 */
public class Climate {}

e).聚合關係

  • 聚合關係是關聯關係的一種,耦合度強於關聯,他們的代碼表現是相同的,僅僅是在語義上有所區別:關聯關係的對象間是相互獨立的,而聚合關係的對象之間存在着包容關係,他們之間是「總體-個體」的相互關係。
  • 總體和局部的關係,二者擁有獨立的生命週期,是has-a的關係。
  • 聚合關係中做爲成員變量的類通常使用 set 方法賦值。
  • 使用空心菱形和大於箭頭表示,菱形指向聚合方,箭頭指向個體。空心菱形是能夠放東西的盤子,能夠用來裝東西,東西放在盤子裏就能夠裝進去。
  • UML類圖表示

聚合關係

  • 如圖所示:大雁羣中有不少只大雁,大眼羣有獨立的行爲(一字飛行,V字飛行)
/**
 * 大雁羣
 */
public class BigWildGooseGroup {

    public List<BigWildGoose> bigWildGooses;


    public void oneFly() {
        System.out.println("一字飛行");
    }

    public void vfly() {
        System.out.println("V字飛行");
    }

    public List<BigWildGoose> getBigWildGooses() {
        return bigWildGooses;
    }

    public void setBigWildGooses(List<BigWildGoose> bigWildGooses) {
        this.bigWildGooses = bigWildGooses;
    }
}
/**
 * 大雁
 */
public class BigWildGoose extends Bird implements IFly{
    @Override
    public void fly() {}
}

f).實現關係

  • 表示一個類實現一個或多個接口的方法。接口定義好操做的集合,由實現類去完成接口的具體操做, 在 Java 中使用 implements 表示。在 Java 中,若是實現了某個接口,那麼就必須實現接口中全部的方法。
  • 使用空心三角和虛線表示,箭頭指向接口。實線關係對類的耦合比較弱,因此使用虛線表示。
  • 通常使用接口定義抽象行爲。好比鳥具備飛行的行爲!
  • UML表示

實現關係

  • 如圖所示:大雁實現了飛行接口,擁有了飛行行爲。
/**
 * 大雁
 */
public class BigWildGoose extends Bird implements IFly{
    @Override
    public void fly() {}
}
/**
 * 飛行接口
 */
public interface IFly {
    void fly();
}
  • 接口的其餘表示方法:棒棒糖表示法

棒棒糖表示法

0x02.類似關係比較

1.依賴關係和關聯關係

  1. 依賴關係:通常使應用實如今方法上,若是不調用方法使不須要使用的。由於依賴關係不強制,因此用虛線表示!
  2. 關聯關係:關聯關係是類屬性依賴,很關鍵,因此使用實線表示。

2.聚合關係和組合關係,空心和實心菱形

  1. 數量少方向的是菱形箭頭。
  2. 聚合是一個盤子能夠稱不少東西,可是他們是相同的,只是數量不一樣,不一樣的生命週期。是一組事物造成了一個新的總體,具備獨立的生命週期與行爲。
  3. 組合的生命週期是相同的。

3.繼承和實現

  1. 繼承:是類和類之間的關係,因此用實線。
  2. 實現:限制的不明顯,只限制了行爲,因此用虛線。
  3. 只有知道對方信息,才能夠被指向,因此箭頭的方向都是指向父類或接口。

0x04.源碼地址

0x05.參考

相關文章
相關標籤/搜索