設(shè)計(jì)模式前篇之:UML類圖必會(huì)知識(shí)點(diǎn)

UML類圖是學(xué)習(xí)設(shè)計(jì)模式之前必會(huì)必學(xué)的知識(shí)點(diǎn)裕便,學(xué)習(xí)設(shè)計(jì)模式會(huì)涉及到大量的類結(jié)構(gòu),寫(xiě)這篇文章的同時(shí)也是在記錄自己在學(xué)習(xí)設(shè)計(jì)模式的過(guò)程中遇到的一些問(wèn)題,大家來(lái)一起參考一下吧班挖。

首先看一下類圖概念,簡(jiǎn)單來(lái)說(shuō)就是更加直觀的看一個(gè)類的結(jié)構(gòu)芯砸,按照國(guó)際慣例類圖就是采用UML的方式表示萧芙。

類圖(Class diagram)是顯示了模型的靜態(tài)結(jié)構(gòu),特別是模型中存在的類假丧、類的內(nèi)部結(jié)構(gòu)以及它們與其他類的關(guān)系等双揪。類圖不顯示暫時(shí)性的信息。類圖是面向?qū)ο蠼5闹饕M成部分包帚。它既用于應(yīng)用程序的系統(tǒng)分類的一般概念建模渔期,也用于詳細(xì)建模,將模型轉(zhuǎn)換成編程代碼渴邦。

下面引用一個(gè)常用UML類圖圖示樣例:

圖例

基本概念:

矩形框代表一個(gè)類的結(jié)構(gòu)(Class)疯趟,類圖分為三層:

第一層代表類名,若是抽象類類名用斜體表示谋梭。
第二層代表特性信峻,也就是字段或者屬性。
第三層代表操作瓮床,也就是方法或行為盹舞。

其中,符號(hào)表示訪問(wèn)權(quán)限:‘+’表示public隘庄,‘-’表示private踢步,‘#’表示protected。類與類之間的符號(hào)代表兩個(gè)類的關(guān)系峭沦。

類之間的關(guān)系:

類與類一共有如下幾種關(guān)系:繼承(Generalization)贾虽、實(shí)現(xiàn)(Realization)、依賴(Dependence)吼鱼、關(guān)聯(lián)(Association)蓬豁、聚合(Aggregation)、組合(Composition)菇肃。

1地粪、繼承關(guān)系

繼承關(guān)系中,子類繼承父類的所有特征和行為琐谤◇〖迹看到類圖中的動(dòng)物類和鳥(niǎo)類,鳥(niǎo)類是一種動(dòng)物,兩者是繼承的關(guān)系质礼。UML類圖表示如下:

繼承關(guān)系例圖

繼承關(guān)系用三角形+實(shí)線表示旺聚,方向從子類指向父類。

在Java語(yǔ)言中眶蕉,extends關(guān)鍵字代表繼承砰粹,簡(jiǎn)單得按照這個(gè)類圖寫(xiě)一下代碼吧:

public class Animal {
    public int lives;

    public void breeding(){
        if (lives > 0){
            System.out.println("我要繁殖啦~");
        }
    }
}

public class Bird extends Animal {
    public String feather;

    public void layEggs(){
        System.out.println("下蛋方法");
    }
}
2、實(shí)現(xiàn)關(guān)系

實(shí)現(xiàn)是類與接口的一種關(guān)系造挽,類實(shí)現(xiàn)接口的所有特征與行為碱璃。看到大雁類和飛翔接口的位置饭入,接口有interface標(biāo)識(shí)嵌器,它們之間的是實(shí)現(xiàn)關(guān)系,類必須實(shí)現(xiàn)接口中的所有方法谐丢。因此大雁類具有"飛()"方法爽航。類圖如下:

實(shí)現(xiàn)關(guān)系例圖

實(shí)現(xiàn)關(guān)系用三角形+虛線表示,方向從類指向接口庇谆。

implements關(guān)鍵字代表實(shí)現(xiàn)岳掐,簡(jiǎn)簡(jiǎn)單單過(guò)一下代碼:

public interface Fly {
    public void flyaway(); //飛翔接口
}
public class WildGoose extends Bird implements Fly{

    @Override
    public void flyaway() {
        System.out.println("大雁飛翔了");
    }

    @Override
    public void layEggs() {
        super.layEggs();
        System.out.println("大雁下蛋了");
    }
}
3凭疮、依賴關(guān)系

依賴關(guān)系是一種弱的使用的關(guān)系, 即一個(gè)類的實(shí)現(xiàn)需要另一個(gè)類的協(xié)助饭耳。在類圖中,動(dòng)物依賴于水和空氣才能生存执解,這是依賴關(guān)系的一個(gè)例子寞肖,類圖表示如下:

依賴關(guān)系例圖

依賴關(guān)系用箭頭+虛線表示,方向從依賴類指向被依賴類衰腌。

代碼體現(xiàn)在局部變量新蟆、方法的參數(shù)或者對(duì)靜態(tài)方法的調(diào)用中。補(bǔ)充一下剛才動(dòng)物類的方法:

public class Oxygen {
    @Override
    public String toString() {
        return "氧氣濃度:21%";
    }
}
public class Water {
    @Override
    public String toString() {
        return "100ml的水";
    }
}
public class Animal {
    public int lives;

    public void breeding() {
        if (lives > 0) {
            System.out.println("我要繁殖啦~");
        }
    }

    //新方法右蕊,新陳代謝
    public void metabolism(Oxygen o, Water w) {
        System.out.println("新陳代謝需要" + o.toString() + "和" + w.toString());
    }

}
4、關(guān)聯(lián)關(guān)系

關(guān)聯(lián)關(guān)系比較常見(jiàn),是一種強(qiáng)的宾濒、穩(wěn)定的宠进、持久的關(guān)系, 它使一個(gè)類知道另一個(gè)類的屬性和方法。例子中表示為企鵝‘知道’氣候的變化萝风。

關(guān)聯(lián)關(guān)系例圖

關(guān)聯(lián)關(guān)系用箭頭+實(shí)線表示嘀掸。方向從關(guān)聯(lián)類指向被關(guān)聯(lián)類。

代碼體現(xiàn)在成員變量中规惰,繼續(xù)寫(xiě)一下代碼吧:

public class Climate {
    
}
public class Penguin extends Bird{
    private Climate climate;
}
5睬塌、聚合關(guān)系

聚合關(guān)系表示部分與整體的一種弱的擁有關(guān)系,體現(xiàn)的是A對(duì)象可以包含B對(duì)象,但B對(duì)象不是A對(duì)象的一部分揩晴。根據(jù)圖例就可以理解為雁群包含了每一只大雁勋陪,但大雁離開(kāi)雁群還是可以獨(dú)立存在的,所以大雁不是雁群的一部分硫兰。

聚合關(guān)系例圖

聚合關(guān)系用空心菱形+實(shí)線箭頭表示粥鞋,菱形頂端為整體。

代碼體現(xiàn)在成員變量中瞄崇,繼續(xù)擼一下代碼呻粹,簡(jiǎn)單寫(xiě)了下邏輯:

public class WideGooseAggregate {
    private WildGoose[] arrayWideGoose = new WildGoose[3];

    public WideGooseAggregate(){
        arrayWideGoose[0] = new WildGoose();
        arrayWideGoose[1] = new WildGoose();
        arrayWideGoose[2] = new WildGoose();
    }

    public void vFly() {
        System.out.println("V型飛行");
        for (WildGoose wGoose : arrayWideGoose) {
            wGoose.flyaway();
        }
    }

    public void hFly() {
        System.out.println("一型飛行");
        for (WildGoose wGoose : arrayWideGoose) {
            wGoose.flyaway();
        }
    }
}
6、組合關(guān)系

組合關(guān)系表示部分與整體的一種強(qiáng)的擁有關(guān)系苏研,體現(xiàn)為嚴(yán)格的部分和整體關(guān)系等浊,部分和整體的生命周期一樣。根據(jù)例子摹蘑,翅膀與鳥(niǎo)就是組合的關(guān)系筹燕。翅膀是鳥(niǎo)的一部分,翅膀脫離了鳥(niǎo)就不能獨(dú)立存在衅鹿。

組合關(guān)系例圖

組合關(guān)系用實(shí)心菱形+實(shí)線箭頭表示撒踪,菱形頂端為整體。

代碼體現(xiàn)在成員變量中大渤,再改一下剛才鳥(niǎo)類的代碼吧:

public class Bird extends Animal {
    public String feather;
    private Wings wings; //翅膀
    
    public Bird(){
        //翅膀與鳥(niǎo)的生命周期一樣
        wings = new Wings();
    }
    
    public void layEggs(){
        System.out.println("下蛋方法");
    }
    
}

總結(jié)

在理解性記憶的同時(shí)制妄,允許我再啰嗦一下:

繼承:三角形+實(shí)線
實(shí)現(xiàn):三角形+虛線
依賴:箭頭+虛線
關(guān)聯(lián):箭頭+實(shí)線
聚合:空心菱形+實(shí)線箭頭
組合:實(shí)心菱形+實(shí)線箭頭

此文章主要從記住類圖長(zhǎng)什么樣子和代碼應(yīng)該怎么寫(xiě)的角度去寫(xiě),歡迎大家討論泵三。

轉(zhuǎn)載請(qǐng)注明出處喔:http://www.reibang.com/p/fcb642ff3be5

推薦閱讀

基礎(chǔ)篇:
設(shè)計(jì)模式前篇之——UML類圖必會(huì)知識(shí)點(diǎn)
設(shè)計(jì)模式前篇之——一起過(guò)一下面向?qū)ο蟮母拍?/a>
創(chuàng)建型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:簡(jiǎn)單工廠模式——來(lái)試試接入支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:工廠方法模式——數(shù)據(jù)存儲(chǔ)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:抽象工廠模式——更換數(shù)據(jù)庫(kù)例子
簡(jiǎn)易理解設(shè)計(jì)模式之:建造者模式——學(xué)習(xí)使用“鏈?zhǔn)秸{(diào)用”
簡(jiǎn)易理解設(shè)計(jì)模式之:原型模式——深耕捞、淺拷貝的概念
簡(jiǎn)易理解設(shè)計(jì)模式之:?jiǎn)卫J健獑卫J降膸追N常用寫(xiě)法
結(jié)構(gòu)型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:適配器模式——Android列表視圖控件設(shè)計(jì)方式
簡(jiǎn)易理解設(shè)計(jì)模式之:橋接模式——穿衣服經(jīng)典案例2
簡(jiǎn)易理解設(shè)計(jì)模式之:組合模式——實(shí)現(xiàn)View中的樹(shù)狀結(jié)構(gòu)
簡(jiǎn)易理解設(shè)計(jì)模式之:裝飾模式——穿衣服經(jīng)典案例
簡(jiǎn)易理解設(shè)計(jì)模式之:外觀模式——第三方SDK的幫助類
簡(jiǎn)易理解設(shè)計(jì)模式之:享元模式——五子棋游戲例子
簡(jiǎn)易理解設(shè)計(jì)模式之:代理模式——iOS視圖控件設(shè)計(jì)方式
行為型模式:
簡(jiǎn)易理解設(shè)計(jì)模式之:策略模式——優(yōu)化一下支付功能
簡(jiǎn)易理解設(shè)計(jì)模式之:模板方法模式——Android中的BaseActivity基類
簡(jiǎn)易理解設(shè)計(jì)模式之:觀察者模式——監(jiān)聽(tīng)與回調(diào)
簡(jiǎn)易理解設(shè)計(jì)模式之:狀態(tài)模式——優(yōu)化登錄操作
簡(jiǎn)易理解設(shè)計(jì)模式之:備忘錄模式——Word文檔的工作原理
簡(jiǎn)易理解設(shè)計(jì)模式之:迭代器模式——遍歷對(duì)象的好幫手
簡(jiǎn)易理解設(shè)計(jì)模式之:命令模式——實(shí)現(xiàn)命令的參數(shù)化配置
簡(jiǎn)易理解設(shè)計(jì)模式之:責(zé)任鏈模式——OA中請(qǐng)假流程示例
簡(jiǎn)易理解設(shè)計(jì)模式之:中介者模式——多人聊天室例子
簡(jiǎn)易理解設(shè)計(jì)模式之:解釋器模式——語(yǔ)言和文法
簡(jiǎn)易理解設(shè)計(jì)模式之:訪問(wèn)者模式——員工考核例子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市烫幕,隨后出現(xiàn)的幾起案子俺抽,更是在濱河造成了極大的恐慌,老刑警劉巖较曼,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件磷斧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捷犹,警方通過(guò)查閱死者的電腦和手機(jī)弛饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伏恐,“玉大人孩哑,你說(shuō)我怎么就攤上這事〈滂耄” “怎么了横蜒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵胳蛮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我丛晌,道長(zhǎng)仅炊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任澎蛛,我火速辦了婚禮抚垄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谋逻。我一直安慰自己呆馁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布毁兆。 她就那樣靜靜地躺著浙滤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪气堕。 梳的紋絲不亂的頭發(fā)上纺腊,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音茎芭,去河邊找鬼揖膜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梅桩,可吹牛的內(nèi)容都是我干的壹粟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摘投,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼煮寡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起犀呼,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薇组,沒(méi)想到半個(gè)月后外臂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡律胀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年宋光,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炭菌。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罪佳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黑低,到底是詐尸還是另有隱情赘艳,我是刑警寧澤酌毡,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蕾管,受9級(jí)特大地震影響枷踏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掰曾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一旭蠕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旷坦,春花似錦掏熬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至番电,卻和暖如春岗屏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漱办。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工这刷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娩井。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓暇屋,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親洞辣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咐刨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容