版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86560012
- 本章内容旨在丰富前面章节所学UML建模的语义的细节
- 高级(advanced)类建模
- 附加的建模概念:构造型、约束、导出信息、可见性、限定关联、关联类、参数化类。这些概念是可选的,很多模型没有它们也足够了
- 扩展机制,并非UML本身内容,如构造型、约束、标签定义和标签值
- 普通的UML标准可能没有满足某些更特殊的建模需要
- 构造型stereotypes
- 构造型对现有UML元素进行扩展,使现有元素的语义多样化
- 表示方法,用双尖角括号括住的一个名字,如<<global>>,<<include>>
- 构造型扩展的是语义而不是UML结构
- 注释和约束Comments and constraints
- 在UML任何地方都可以插入注释
- 注释:能表示为UML笔记,在需要注释的对象加虚线连接一个卷角书页
- 约束:指条件限制,在需要限制的单个对象(该对象旁添加大括号)或对象之间(关联,一个虚线依赖箭头,约束绑定在该箭头上,如iii.标签中的例子)
- 标签tags
- 标签的定义:是构造型的特性,表示为构造型声明的类矩形的一个属性
- 标签的值:是一个名-值对,附属于一个模型元素
- 标签与约束相似,表示模型中的任意文本信息,写在大括号中
- 形式如下:tag=value
- 如:
- 可见性与封装
- 可见性
- 应用于类属性和操作的整套可见性标志:
- + 公共可见性
- - 私有可见性
- # 保护可见性
- ~ 包可见性
- 应用于类属性和操作的整套可见性标志:
- 可见性
- 受保护的可见性(protected visibility),应用于继承的情况下,包含了包可见性
- 父类的属性可以被继承他的子类访问(父类的私有特性也可以)
- java包可见性(package visibility),默认情况
- 对一个包中的所有其他类可见
- 保护的(和公共的)也具有包访问性,但反过来不成立。即同一包中的其他类能够访问保护特性,但如果派生类和基类在不同的包中,派生类就不能访问那些具有包可见性的特性。
- c++友元可见性Friend,类似于java的包可见性
- 如:friend void Book::putOnBookShelf()
- 友元可以是另一个类或另一个类的操作。友元关系是单向的,A类让B类成为友元,但B类不一定是A类的友元,即B类不承认
- 友元关系要在授予友元关系的类中声明
- 在UML中,友元关系显示为一条虚线表示的依赖关系,从一个友元类或操作指向授予友元关系的类。构造型<<friend>>绑定在依赖箭头上
- Public,全天下都可以访问,包含了包可见性
- private,只能由类的内部对象访问
- 导出信息derived information
- 是一种经常应用于属性或关联的约束
- 导出信息在模型中是冗余的——它可以在需要时计算出来
- 没有丰富分析模型的语义,但可以使模型更容易可读
- 在设计模型中,需要考虑信息存取的最优化问题,所以了解哪些信息是导出的更为重要
- 在UML表示法是在导出属性名或关联名的前面加一条斜线"/"
- 导出属性
- 导出关联,并不推荐,因为导出后形成了关联的回路
- 限定关联,在关联上加属性,在二元关联的“一对多”的“多”的一端加
- 不用限定关联,也可以构造出完整而又充分表现力的类模型。但如果要使用限定关联,就要全面一致的使用
- 通过特定的方式将一对多降成一对一,多对多降成多对一
- 关联类与具体化类
- 关联类更像ER图的多对多的联系
- 高级泛化(generalization)与继承(inheritance)建模
- 泛化是一种静态状态,是类之间的语义关系;继承是一种动作机制
- 泛化的好处是减少关联的对象,
- 泛化和可替换性
- 虽然泛化引入了新的类,但它可以减少模型中的关联关系和聚合关系的总数
- 良好运用的泛化能够提高系统模型的表现力、可理解性和抽象程度
- 泛化的作用来源于可替换性原则——在代码中任何访问超类对象的地方,都可以用子类对象来替换超类对象
- 继承和封装,两者是互相矛盾正交关系
- 继承:子类可以去访问父类的属性和方法,允许子类直接访问保护属性
- 封装:基于类的封装,类的内部对象的属性不能隐藏
- 接口继承
- 当以可替换性为目标来使用泛化时,它就同接口继承是同义词了
- 接口继承的别名是子类型
- 继承包括泛化和接口继承
- 抽象类,只要有部分抽象方法就是抽象类
- 接口里只能有常量,全是抽象方法
- 实现继承
- 恰当使用——扩展继承
- 将继承作为类的增量式定义,子类具有比超类更多的特性(属性、方法)
- 有问题的使用——限制继承
- 有一些继承来的特性在子类中被禁止(重载)
- 子类中一些继承来的特性被覆盖,叫限制继承
- 不恰当的使用——方便继承
- 实现继承的危害:
- 自递归总是发生在实现继承
- 实现继承按很多标准来说都是一件有风险的事情
- 脆弱基类:父类属性方法的改变会影响子类,
- 只有尽可能将子类的共有属性抽取出来
- 重载和回调(向上调用、向下调用)
- 重载,
- 恰当使用——扩展继承
就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。
- 多重继承
- 多重接口继承,考虑了接口协议的合并
- 多重实现继承,允许实现片段的合并,可用接口继承替代
- 高级聚合与委托(delegation)建模
- 一个复合类包含一个或多个构件类,构件类是其复合类的元素
- 给聚合增加更多的语义
- exclusiveOwns聚合(复合)
- {frozen}约束应用于构件类,它说明一个构件类对象不能再连接到另一个复合对象上。构建对象可以被完全删除,但不能将它转换给另一个所有者。
- Owns聚合(复合)
- 一个构建对象最多属于一个复合对象,但它能被再连接到一个复合对象上。当一个复合对象被删除,它的构件对象也被删除
- Has聚合
- 不具有存在依赖性,复合对象的删除不会自动向下扩散到构件对象上
- 只有传递性和非对称性的特点
- Member聚合
- 考虑到聚合关系中多对多的多重性。对于存在依赖性、传递性、非对称性、固有属性(冻结特性)没有做特定的设想
- exclusiveOwns聚合(复合)
- 作为泛化的可选方案的聚合
- 委托delegation和原型prototypical系统
- 每当复合对象(外部对象)自身不能完成一项任务时,它能够访问它的构件对象(内部对象)中的方法,这称为委托
- 委托和继承
- 聚合使用委托的方法来复用构建对象的实现
- 委托delegation和原型prototypical系统
- 高级交互(interaction)建模
- 时序图关注消息的顺序,通信图强调对象的关系
- CASE工具倾向于为顺序图的可视化提供更好的工具,通信图能在开会讨论时用作手绘的草图
- 时序图
- 生命线
- 一条生命线代表一个交互参与者
- 消息表示在交互的生命线之间的通信
- 接收到消息的生命线/对象激活了相关的操作方法
- 当控制流聚焦到一个对象时,在UML2.0中称为执行规格说明(以前叫激活)
- 参与交互过程的类对象名称
- 一个类的未命名实例——:Class1
- 一个类的命名实例——c2:Class2
- 一个类,即元类的一个实例——:Class(空格) 3,通常显示对类自身静态方法的调用,静态方法通常也不需要实例化再调用
- 一个接口——:Interface1
- 消息
- 同步消息synchronous messages,
- 调用者阻塞,即要等待响应,通常用来传递和数据
- 实心箭头表示
- 异步消息asynchronous messages,
- 调用者不阻塞,允许多线程执行,通常用来传递控制
- 开放箭头表示
- 对象创建消息object creation messages
- 常用关键字(new/create)命名
- 开放箭头表示,例:new(a,b),a和b是提供给Class2的两个参数
- 回复消息reply
- 将交互的输出值传递给发起动作的调用者
- 带有开放箭头的虚线,常标注有返回值的描述
- 注意,回复消息只是用来显示消息返回结果的两种方法中的一种。另一种是在消息语法中指明返回变量,如int=doC
- 同步消息synchronous messages,
- 生命线
- 对象销毁在图上用X表示,在交互模型中创建的对象也将要在同一个交互模型中被销毁(如c2:Class2)对于不具备自动垃圾回收的语言(如C++)应该由模型中的另一个对象用一个单独的<<destroy>>来发起销毁。
- 在生命线代表的是接口(:Interface1)或抽象类的情况下,被调用方法是从一个实现了接口的类或一个继承了抽象类的具体类执行
- 激活
- 生命线的长度表示执行时间,代表该消息调用方法的执行时间
- 说明基本技术
- 片段
- 交互片段,交互可以包含更小的交互片段,称为组合片段。组合片段的语义由交互操作符确定
- alt:可选片段,在守卫条件中表达if-then-else逻辑
- opt:选择片段,如果守卫条件为真,执行该片段
- 选择片段只在可选片段的else条件内执行,并且当守卫条件为真时才执行
- loop:循环片段,服从循环条件而重复多次的片段
- break:中断片段,如果中断条件为真,就执行中断片段,而不执行外围片段的剩余部分
- parallel:并行片段,允许所包含行为交替执行
- 交互使用
- 一个外围交互对另一个交互的引用称为交互使用,外围交互用标签sd(顺序图)标注。
- 交互使用标签ref(引用)标注,它指的是另一个单独创建的sd交互
- 通信图