JavaScript面向对象之UML类图

UML类图

什么是UML类图

UML(Unified Modeling Language)类图,中文意思为“统一建模语言”,我们之所以要在面向对象中介绍它,是因为,我们在后面的设计模式中,每一种模式,都有它对应的类图,它作为一种概述的表达来反应我们的设计,我们可以不用面对代码,只面对这样的类图,来进行前期的设计讨论。对于UML,其内容也是非常多,我们只关注其“类图”概念,这样和我们讲的面向对象和将来要将的设计模式关系比较紧密。

画图工具

如何画类图

我们先来看一个类图



这是我在画图工具上,拖出了一个类,其默认样式,其中,有一些符号这里先做一个简单的介绍

  1. 我们最终生成的类图,为三行,第一行为“类名”,第二行为属性,第三行为方法。

  2. 其中,“+”表示public,“#”表示protected,“-”表示private

  3. 在定义属性好方法的参数的时候,都可以在其后面用“:”定义其数据类型

下面我们将下面这个类用UML类图的形式表现出来

class People {
    constructor(name, age) {
        this.name = name
        this.age = age
    }
    eat () {
        alert(`${this.name} eat someThing`)
    }

    speak () {
        alert(`My name is ${this.name}, age ${this.age}`)
    }
}

在画UML类图的时候,我们无需关心其内部的实现方法,只需要用类图表现出来即可。按照上面我们的规则,画出的类图如下


UML类图之间的关系

我们在实际开发中,不可能只有一个类,一定是在一些类之间存在着某些关系,如组合,继承等常见的类之间的关系。那么我们如何在UML类图中表示这样的关系呢?
关于UML类图之间的关系呢,也是分好多种,但是我们也只是介绍和我们JS相关的常用关系,其中

  • 泛化,表示继承
  • 关联,表示引用

那么我们如何使用UML类图来表示这种关系呢?我们先开看一下下面这段代码

class People {
    constructor (name, house) {
        this.name = name
        this.house = house
    }

    saySomething () {
        console.log('I am People')
    }
}

class A extends People {
    constructor (name, house) {
        super(name, house)
    }
    saySomething () {
        console.log('I am A')
    }
}

class B extends People {
    constructor (name, house) {
        super(name, house)
    }
    saySomething () {
        console.log('I am B')
    }
}

class House {
    constructor(city) {
        this.city = city
    }

    showCity () {
        console.log(this.city)
    }
}

const aHouse = new House('beijing')
const a = new A('a', aHouse)
const b = new B('b')
b.saySomething()

上面的代码比较简单,其类之间的关系为A和B继承于People,House和People为关联关系,因为我们将House的实例传给个A的构造函数。那么我们如何将上面的类关系用UML类图的形式表现出来呢?如下图:



针对上图,我们解析以下几点

  • 因为A和B的属性全部继承自People,所以A和B的属性行可以不写
  • 继承关系使用直线空心箭头来指向父类
  • House和People为引用关系,People中的house属性为House类型,所以由People指向House,使用直线实心箭头

这样,我们就使用UML类图,对上面的代码进行了描述和设计,我们无需关注代码的实现,在设计初期就能使用UML类图很好的反应出各个类之间的关系。

UML类图总结

  • UML为“一列三行”的表格,每一行分别表示类名、属性、方法
  • UML类图可以通过不同的表格连线表示类之间的关系:泛化(继承)、关联(引用)
  • UML类图远比本文介绍的复杂,后续要多画多练习,结合设计模式(看后续文章)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354