目录
文章目录
UML类图
统一建模语言(英语:Unified Modeling Language,缩写 UML)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iwCtO8nq-1604042182857)(https://upload.wikimedia.org/wikipedia/commons/9/93/Uml_classes_en.svg)]
PS:上述链接没办法直接被CSDN爬取到,需要查看的话,可以直接访问Uml_classes_en
本文内容大多来自维基百科《类图》或者UML类图官网-The Unified Modeling Language。
继承(Inheritance, IS-A)
如果一个类别B“继承自”另一个类别A,就把这个B称为“A的子类”,而把A称为“B的父类别”也可以称“A是B的超类”。用带实线的空心三角箭头表示。继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类追加新的属性和方法也是常见的做法。
现今面向对象程序设计技巧中,继承并非以继承类别的“行为”为主,而是继承类别的“类型”,使得组件的类型一致。另外在设计模式中提到一个守则,“多用合成,少用继承”,此守则也是用来处理继承无法在运行期动态扩展行为的遗憾。
比如医院中有病人、医生、护工、护士等等各行各业的人,为了整个模型建立,同时减少重复的模型定义,我们可以定义一个具有标准人(Person)属性的抽象类,然后对于每一个实际人做一个具体的实现,比如下图的病人(Patient)和抽象的人(Person)的继承关系图。
实际例子:
典型的比如Oracle JDK 11
的java.util
中:
Set
、List
、Map
、SortedSet
、SortedMap
等接口均继承自Collection
接口HashMap
、LinkedHashMap
、TreeMap
等均继承自AbstractMap
;ArrayList
、LinkedList
、Vector
等均继承自AbstractList
(**注:**这里其实存在一个Java圈比较著名的jdk设计问题,也即Stack
为了便捷实现,选择继承Vector
而不是最基础的AbstractList
,从而造成用户在使用过程中,可以对Stack
的任意位置进行直接插入,破坏了Stack
的定义,因此官方建议使用Deque
模拟栈而不是直接使用Stack
类。)
泛化(Generalization)
泛化,即继承的反方向,指的是一个类(称为父类、父接口)具有另外的一个(或一些)类(称为子类、子接口)的共有功能。子类可视为其父类的特例,并可以增加新功能。用带空心三角形箭头的实线表示。
**注:**继承和泛化是同一个关系图(inheritance)的两端。
实现(Realization)
实现(Realization)指的是一个class类实现interface接口(可以是多个)的功能;在Java中此类关系通过关键字implements明确标识。用带空心三角形箭头的虚线表示。
比如一个网站提供给外部一个查询的接口,外部不用关注这个网站怎么实现的查询,只需要知道单击查询(调用查询接口)就可以获得返回结果,所以外部只需要拿到SiteSearch接口即可,而网站自己为了提供服务,需要自己在SearchService中实现对外承诺的功能。
实际例子
典型的比如Oracle JDK 11
的java.util
中:
ArrayList
、LinkedList
、Vector
、AbstractList
等均是List
接口的实现<