UML的类图详解

UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是一种静态建模方法。类图中的类,与面向对象语言中的类的概念是对应的。
1 类结构
在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称、属性和方法。


其中,
一般类的类名用正常字体粗体表示,如上图;抽象类名用斜体字粗体,如User
;接口则需在上方加上<<interface>>

属性和方法都需要标注可见性符号,+
代表public
,#
代表protected
,-
代表private

另外,还可以用冒号:
表明属性的类型和方法的返回类型,如+$name:string
、+getName():string
。当然,类型说明并非必须。
2 类关系
类与类之间的关系主要有六种:继承、实现、组合、聚合、关联和依赖,这六种关系的箭头表示如下,

接着我们来了解类关系的具体内容。
3 六种类关系
六种类关系中,组合、聚合、关联这三种类关系的代码结构一样,都是用属性来保存另一个类的引用,所以要通过内容间的关系来区别。
3.1 继承
继承关系也称泛化关系(Generalization),用于描述父类与子类之间的关系。父类又称作基类,子类又称作派生类。
继承关系中,子类继承父类的所有功能,父类所具有的属性、方法,子类应该都有。子类中除了与父类一致的信息以外,还包括额外的信息。
例如:公交车、出租车和小轿车都是汽车,他们都有名称,并且都能在路上行驶。

PHP代码实现如下:
<?phpclass Car{ public $name; public function run() { return '在行驶中'; }}class Bus extends Car{ public function __construct() { $this->name = '公交车'; }}class Taxi extends Car{ public function __construct() { $this->name = '出租车'; }}// 客户端代码$line2 = new Bus;echo $line2->name . $line2->run();
3.2 实现
实现关系(Implementation),主要用来规定接口和实现类的关系。
接口(包括抽象类)是方法的集合,在实现关系中,类实现了接口,类中的方法实现了接口声明的所有方法。
例如:汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。
实现关系

<?phpinterface Vehicle{ public function run();}class Car implements Vehicle{ public $name = '汽车'; public function run() { return $this->name . '在路上行驶'; }}class Ship implements Vehicle{ public $name = '轮船'; public function run() { return $this->name . '在海上航行'; }}// 客户端代码$car = new Car;echo $car->run();
3.3 组合关系
组合关系(Composition):整体与部分的关系,但是整体与部分不可以分开。
组合关系表示类之间整体与部分的关系,整体和部分有一致的生存期。一旦整体对象不存在,部分对象也将不存在,是同生共死的关系。
例如:人由头部和身体组成,两者不可分割,共同存在。
组合关系

<?phpclass Head{ public $name = '头部';}class Body{ public $name = '身体';}class Human{ public $head; public $body; public function setHead(Head $head) { $this->head = $head; } public function setBody(Body $body) { $this->body = $body; } public function display() { return sprintf('人由%s和%s组成', $this->head->name, $this->body->name); }}// 客户端代码$man = new Human();$man->setHead(new Head());$man->setBody(new Body());echo $man->display();
3.4 聚合关系
聚合关系(Aggregation):整体和部分的关系,整体与部分可以分开。
聚合关系也表示类之间整体与部分的关系,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。
例如:公交车司机和工衣、工帽是整体与部分的关系,但是可以分开,工衣、工帽可以穿在别的司机身上,公交司机也可以穿别的工衣、工帽。

<?phpclass Clothes{ public $name = '工衣';}class Hat{ public $name = '工帽';}class Driver{ public $clothes; public $hat; public function wearClothes(Clothes $clothes) { $this->clothes = $clothes; } public function wearHat(Hat $hat) { $this->hat = $hat; } public function show() { return sprintf('公交车司机穿着%s和%s', $this->clothes->name, $this->hat->name); }}// 客户端代码$driver = new Driver();$driver->wearClothes(new Clothes());$driver->wearHat(new Hat());echo $driver->show();
3.5 关联关系
关联关系(Association):表示一个类的属性保存了对另一个类的一个实例(或多个实例)的引用。
关联关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系,只是关联关系的类间关系比其他两种要弱。
关联关系有四种:双向关联、单向关联、自关联、多重数关联。
例如:汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。

在UML图中,双向的关联可以有两个箭头或者没有箭头,单向的关联或自关联有一个箭头。上图对应的PHP代码如下:
<?phpclass Driver{ public $cars = array(); public function addCar(Car $car) { $this->cars[] = $car; }}class Car{ public $drivers = array(); public function addDriver(Driver $driver) { $this->drivers[] = $driver; }}// 客户端代码$jack = new Driver();$line1 = new Car();$jack->addCar($line1);$line1->addDriver($jack);print_r($jack);
在多重性关系中,可以直接在关联直线上增加一个数字,表示与之对应的另一个类的对象的个数。
1..1
:仅一个
0..*
:零个或多个
1..*
:一个或多个
0..1
:没有或只有一个
m..n
:最少m、最多n个 (m<=n)

3.6 依赖关系
依赖关系(Dependence):假设A类的变化引起了B类的变化,则说名B类依赖于A类。
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
依赖关系是一种“使用”关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
例如:汽车依赖汽油,如果没有汽油,汽车将无法行驶。

依赖关系

<?phpclass Oil{ public $type = '汽油'; public function add() { return $this->type; }}class Car{ public function beforeRun(Oil $oil) { return '添加' . $oil->add(); }}// 客户端代码$car = new Car;echo $car->beforeRun(new Oil());
4 总结
这六种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解,各类关系从强到弱依次是:继承→实现→组合→聚合→关联→依赖。如下是完整的一张UML关系图。

(点击图片查看大图)
UML类图是面向对象设计的辅助工具,但并非是必须工具,如果暂时不理解本文的内容,可以继续看设计模式部分,并不会影响。
说明:本文所有UML类图均使用免费的UMLet工具,在比较了Viso和StartUML后,感觉UMLet要好用很多,强烈推荐使用。另外,本文所有的UML类图源文件请点里下载

参考资料:
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
PHP程序员如何理解依赖注入容器(dependency injection container)
php 组合模式
UML类图画法及其之间的几种关系

互联网+时代,时刻要保持学习,携手千锋PHP,Dream It Possible。
原文链接:http://www.awaimai.com/patterns/uml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是...
    php红薯阅读 1,122评论 0 0
  • 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一。Martin Fowler在其著作《UML Di...
    雷雷_zll阅读 13,193评论 0 14
  • UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是...
    php红薯阅读 890评论 0 1
  • UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是...
    斯文小蚂蚁阅读 4,701评论 0 2
  • UML类图是一种结构图,用于描述一个系统的静态结构。类图以反映类结构和类之间关系为目的,用以描述软件系统的结构,是...
    司马东阳阅读 2,251评论 0 1