《UML面向对象建模与设计》第4章——高级类建模

虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!

目录

4.1高级对象和类的概念

4.2关联终端

4.3n元关联

4.4聚合

4.5抽象类

4.6多重继承

4.7元数据

4.8具体化

4.9约束

4.10派生数据

4.11包


4.1高级对象和类的概念

4.1.1枚举

枚举(enumeration):由有限取值集合组成的一种数据类型。

学过什么C语言、C++语言的应该就很能够明白,枚举,说的通俗点,就是说比如我有一个属性Weekend,那么它的取值就是{Saturday,Sunday}。就是属性的值是有限个。

 

●在这里提到枚举的主要作用就是:把枚举的属性作为一个类来设计。

●如图:在方框顶部枚举名称上的《》中列出关键词enumeration,就可以声明枚举。

(泛化:是指父子关系,显然它们并不具有这种关系)

 

4.1.2多重性

●属性的多重性:属性的每个实例确定可能取值的数目。最常用的规范是强制单值[1]、可选单值[0...1],以及多重值[*]。

4.1.3 作用域

作用域:表示一个特征是否可用于对象或类。下划线用于区分类作用域(静态)和对象作用域的特征。

●在类作用域里使用属性来保持类的范围

 

4.1.4可见性

可见性:方法引用其他类的特征的能力。可能的取值包括:

+public:任何方法都可以自由访问公用的(public)特征

#protected:只有包含其中的类和其继承子孙类的方法才可以访问保护的(protected)特征

-private:只有包含其中的类的方法才可以访问私有的(private)特征

~package:在同一个包中作为目标类定义的方法可以访问包(package)特征

 

●选择可见性时,需要考虑①全面理解②可扩充性③上下文

 

4.2关联终端

关联终端:关联的末端

4.3n元关联

●如图是一个三元关联。

●大多数n元关联可以分解成二元关联。要尽量避免多元关联。

●常见的编程语言不能表示n元关联。因此必须把它们提升为类。

 

注:接下来的部分老师并没有讲了,不过我还是准备看一下。

 

4.4聚合

先回顾一下之前学过的:

❶3.2关联:就是两个类之间的一种关系。比如员工类与老板类的关联,员工为老板“打工”,老板“雇佣”员工。它们是一对多的关系。

❷3.3泛化和继承:这两者的区别感觉挺难搞懂的,我在一篇文章中看到:泛化就是有子类抽象出一个父类 而继承就是由父类具体化一个子类。(迪米特的博客:类与类之间的关系-依赖,关联,聚合,组合,继承泛化的区别)。例子就像颜色,可以分为红色、绿色,这样从父类到子类的一种过程就是泛化。

聚合(aggregation)是一种强类型的关联,其中一个聚集对象由多个部件构成。聚合是一种特殊形式的二元关联。

●直白地说,聚合就是一个大机器拆成各种小零件的过程。

❶聚合最重要的特性就是传递性(transitivity):比如B是A的零件,C是B的零件,那么显然,C也是A的零件。A→B→C

❷聚合是反对称的(antisymmertic)。如上面所说的,A显然不可能C的零件。

4.4.1聚合与关联

4.4.2聚合与组合

●UML有两种类型的部分-整体关系:普通的形式称作聚合,有更多限制的形式称作组合。

●组合(composition)是某种形式的聚合。

注:这里一个装配件不是说一对一的关系,而是说不能一个类上聚合连接好几个类。

4.4.3操作的传播

传播(propagation)也称触发(triggering),指当一个操作应用于某个起始对象,该操作会自动应用到网络中的对象。(比如我移动一个手表的同时,我也在移动它的零件)

●例子:某人复制一个文档,同时也复制了文档的段落、符号。

4.5抽象类

●抽象类(abstract class):没有直接实例的类,但其子孙有直接的实例。

●具体类(concrete class):可以实例化的类,它有直接实例。

如图,Employee是抽象类的一个示例。所有的员工必须是全职或者兼职的,所以底下两个类时具体类,是可以直接实例化的。

 

4.6多重继承

多重继承(multiple inheritance):允许某个类有一个以上的父类,并继承所有父类的特征。

♦优点:识别类和增加复用上更加效力。

♦缺点:失去了概念上和实现上的简洁性

●通俗地说,就是说一个人既是......又是......。

 

4.6.1多重继承和种类

●子类只有一次机会沿着一条以上的路径从同一祖先类继承特征。

 

4.6.2多重分类 4.6.3应对方案

●类的实例也是所有祖先类所固有的实例。

●UML允许多重分类,但是大多数OO语言处理的都不好。这就需要使用应对法方案了。

委托(delegation):一种实现机制,在执行中,对象可以借助这种机制来把操作中继到另一个对象。

使用部件组合的委托:把有唯一ID的单个对象替换为一组相关对象,这组对象组成一个扩充对象。组合必须捕获操作,并把它们委托给适当的部件。

继承最重要的类,并委托其余的类。

嵌套泛化。先分解一个泛化,再分解其余的。

 

4.7元数据

元数据(metadata):描述其它数据的数据。对于实际汽车来说,汽车模型是元数据,而实际汽车是数据。

●类描述符对象具有特征,并且反过来它们也有自己的类,被称为元类(metaclass)

 

4.8具体化

具体化(reification):把 不是对象 的实体 提升为对象 的过程。

●两个例子:①数据库管理器;②状态转移图。

4.9约束

●约束(constraint):涉及模型元素的 一种布尔条件,这些元素包括 对象、类、属性、链接、关联和泛化 等。约束限制了元素可以假定的取值。

4.9.1对象上的约束

4.9.2泛化上的约束

●类模型通过其结构捕获了许多约束。UML定义了下列泛化集的关键词

♦不相交的(disjoint):子类互斥,每个对象只属于一个子类。

♦重叠(overlapping):子类可以共享一些对象,对象可以属于一个以上的子类。

♦完整(complete):泛化列举了所有可能的子类。(如周末可以泛化成周六,周日)

♦不完整(incomplete):泛化可能会丢失一些子类。(颜色泛化成黄色、红色,丢失了许多其他颜色)

4.9.3链接上的约束

●多重性是集合基数上的约束。关联的多重性限制了与给定对象相关的对象数量。属性的多重性确定了属性每次实例化可能的取值的数量。

●约束{ordered}表示关联“多”端有明确的顺序,必须保持。

4.10派生数据

派生元素(derived element):一个或多个元素的函数,这些元素也可以是派生出来的。派生元素时冗余的,因为其它元素可以完全确定它。

4.11包

包(package):一组拥有公共主题的元素(包括类、关联、泛化和更小的包)。包可以分割模型,使其更容易理解和管理。

●大的应用会要求多层包。包组成了一棵树,朝着根部方向抽象程度渐增,应用程序是顶层包。

●包的形成有一些不同的主题:支配类、支配性关系、功能的主要方面和对称性。

♦仔细刻画每个包的作用域

♦在单个包中定义每个类

♦让包变得内聚

猜你喜欢

转载自blog.csdn.net/weixin_40851250/article/details/84584463