重温 UML 类图

image

UML 肯定有人不熟悉,很多人知道但是不会看、会看不会写、会写写不熟练。这里我很肯定的告诉大家,UML 你用不好,用不熟练,那你就属于:不入流 的那层次。不管你是拿来装逼也好,还是真的设计复杂的功能、业务框架也好,UML 都是飞涨重要、起决定性的制约因素

我直说一点,你在公司里分享自己的功能、业务框架时,没有没 UML 那完全是2个概念,有的话既能装逼得满分,还能让技术大神认同你,上到领导,下到同事都认同你。效果就是这么明显,所以大家 UML 走起吧

去年我专门写过 UML 类图的文章,但是时间久远都忘的差不多了,当时纯自己查资料学习的,看的囫囵吐枣,其中关系不是非常清楚。这几天在B站上看到了:尚硅谷 韩顺平 图解Java设计模式 这个视频教程,老师讲的非常到位,以下就把 UML 类图其中的6大关系讲的非常清楚、透彻,很赞。其实吧完全不会的内容,要是能找到大机构或是N人的视频讲解,真的比纯自学强太多了,自学很多时候很多认识都是模糊。或是错误的。过写年再回头看,真想抽自己嘴巴,写的都是什么玩意儿...

设计模式视频链接:尚硅谷 韩顺平 图解Java设计模式

古人云:B站是个学习网站,真是诚不欺我呀!一入B站深似海,从此游戏是路人...


UML 图分类

UML 图按照功能可以这么分:

  • 用例图 use case
  • 静态结构图: 类图、对象图、包图、组件图、部署图
  • 动态行为图: 交互图(时序图于协作图)、状态图、活动图

UML 所有的图如下:

  • 类图(Class Diagram): 描述系统所包含的类、类内部结构及类之间的关系。
  • 对象图(Object Diagram): 是类图的一个具体实例。
  • 组件图(Compoment Diagram): 描述代码部件的物理结构以及各部件之间的依赖关系。
  • 部署图(Deployment Diagram): 定义系统中软、硬件的物理体系结构。
  • 用例图(Usecase Diagram): 从用户的角度出发描述系统的功能、需求,展示系统外部的各类角色与系统内部的* 各种用例之间的关系。
  • 时序图(Sequence Diagram): 表示对象之间动态合作的关系。
  • 协作图(Collaboration Diagram): 描述对象之间的协作关系。
  • 状态图(Statechart Diagram): 描述一类对象的所有可能的状态及事件发生时状态的转移条件。
  • 活动图(Activity Diagram): 描述系统中各种活动的执行顺序。

类图是 UML 中最核心的图


UML 类图中类的6种关系

  • 依赖泛化(继承)实现关联聚合组合

看着很多啊,但是就起根本,只有3种关系:

  • 类和属性、参数之间的相互依赖
  • 类的继承
  • 接口的实现

其他的关系大家可以这样理解:

  • 关联 是更复杂、更详细表达的 特殊依赖
  • 聚合 是使用 set 方式传递数据的 特殊关联
  • 组合 是使用 new 方式产生数据的 特殊关联

ok,UML 中大家费解的类关系其实就是这么回事


泛化关系

泛化关系 就是 继承关系,这点就不用说了

UML 图标: 实线+空箭头

image


实现关系

实现关系 不用说了,就是实现接口

UML 图标: 虚线+空箭头

image

依赖关系

定义: 如果类中用到了对方,那么他们之间就存在依赖关系

举例 1: A 中有个成员变量 B,那么就可以说 A 依赖了 B

举例 2: Person 类依赖了 IDCard

class Person {
  IDCard _idCard;
}

class IDCard {
  String info;
}

UML 图标: 虚线+短箭头

image

特殊说明:

  1. 并不是只有成员变量才可以成为依赖,不管你在哪里用到的这个对象,都可以称为依赖,包括以下情境,只要满足下面的使用情境,就可以称为:依赖
    • 类中用到了对方
    • 类的成员属性
    • 方法的返回类型
    • 方法的参数类型
    • 方法中使用到
  1. 因为 关联依赖 的更详细说明, 关联 是专门描述成员属性的关系,所以依赖中所有涉及成员属性的地方更适合使用:关联、聚合、组合。因为大家看 UML 时看到依赖,那么肯定就可以排除成员属性的情况,一般多是方法使用到对方

关联关系

定义: 类于类之间的练习,是依赖关系的特列

特性: 关联关系是更具体的依赖关系,关联关系只描述:成员变量,也就是类和其成员属性之间的关系,可以是:单向一对一双向一对一。所以关联关系的核心是:导航性,通过关联关系我们只看 UML 就可以精确的了解类之间是怎么组织的了

UML 图标:

  • 单向: 实线+短箭头
    image
  • 双向: 实线+没有箭头
    image

举例 1: 单向一对一

class Person {
  IDCard _idCard;
}

class IDCard {
  String info;
}
image

举例 2: 多向一对一

class Person {
  IDCard _idCard;
}

class IDCard {
  Person _person;
  String info;
}
image

聚合关系

定义: 整体和部分之间的关系

特性: 同样只描述成员属性、并且整体和部分是可以分开的,通常表现为那些通过 set 方法传递数值的成员变量,需要注意的是聚合关系是关联关系的特例

UML 图标:

  • 单向: 实线+空菱形
    image

举例: 电脑和鼠标、显示器就是典型的聚合关系,鼠标和键盘都是热插拔的,没有鼠标键盘不影响开机,电脑一样可以跑起来

class Computer {
  Keyborad _keyborad;
  Monitor _monitor;

  set keyborad(Keyborad value) {
    _keyborad = value;
  }

  set monitor(Monitor value) {
    _monitor = value;
  }
}

class Keyborad {}

class Monitor {}

组合关系

定义: 同样也是整体和部分之间的关系

特性: 同样只描述成员属性、整体和部分是不可以分开的,通常表现为那些通过 new 创建出来的成员变量,需要注意的是组合关系也是关联关系的特例。当然组合还表现为整体若是销毁了,组件也同样必须销毁

UML 图标:

  • 单向: 实线+实心菱形
    image

举例: 电脑和机箱,机箱是电脑的核心所在,没有机箱就没有电脑一说,机箱是电脑永远不可或缺的部分,这就是典型的组合关系,

class Computer {
  Keyborad _keyborad;
  Monitor _monitor;
  Chassis _chassis = Chassis();

  set keyborad(Keyborad value) {
    _keyborad = value;
  }

  set monitor(Monitor value) {
    _monitor = value;
  }
}

class Keyborad {}

class Monitor {}

class Chassis {}
image

总结

  1. 虽然所有的类于属性自之间的关系都可以用依赖表示,但是对于成员变量来说,我们更倾向于使用关联、聚合、组合,剩下的可以用到依赖的时候就是方法传参,返回值的情况居多了,所以大家注意

  2. 实线比虚线更能表示类之间的紧密关系 - 继承用的实线,接口实线用的虚线,继承的关系可比接口关系近多了。依赖是虚线,关联是实现,自然描述作为成员属性的关联自然比只剩下方法可以参数返回值可以描述的依赖要和类的关系更加紧密了

  3. 实心表示不可分割,空心表示可以分离 - 这点从聚合和组合就能看出来,除了组合之外,谁用实心的了


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

推荐阅读更多精彩内容