type
status
date
slug
summary
tags
category
icon
password
一、面向对象的相关概念
对象
我们认为,在应用领域中有意义的、与所要解决的问题有关系的任何事物,都可以作为对象,它既可以是具体概念,也可以是人为的概念,还可以是任何具有明确边界和意义的事务。
例如,椅子是一种家具,在面向对象上下文中,这话的意思是:椅子是一个对象,它属于一个称为“家具”的对象类,该对象类具有价格、尺寸、重量和颜色等属性,椅子继承了家具类定义的所有属性,椅子可以买卖、修理和使用等功能。
客观世界中的对象,既具有静态的属性,又具有动态的行为。
对象是对属性值和操作的封装。
例如,在家具类中,我们可定义一系列如下操作:买卖、修补和移动等,这样作为家具类中成员之一的椅子就继承了上述操作。
对象的特点:
- 对象以数据为中心,操作围绕着数据来设置;
- 对象是主动的;
- 对象实现了数据封装,一个对象类型可看作是一种抽象数据类型;
- 对象具有并行性;
- 对象独立性好。
面向对象
面向对象=对象+类+继承+通信
一个面向对象的程序的每一成份应是对象,计算是通过新的对象的建立和对象之间的通信来执行的。
面向对象的特点:
- 抽象性:对象的数据抽象和行为抽象;
- 封装性:信息隐蔽(两个视图);
- 共享性:
- 同一类中所有实例共享数据结构和行为特征;
- 同一应用中所有实例通过继承共享数据结构和行为特征;
- 不同应用中所有实例通过复用共享数据结构和行为特征。
类
类的定义
- 类是一组具有相同数据结构和相同操作的对象的集合。
- 类的定义包括一组数据属性和在数据上的一组合法操作。
- 类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。
- 在一个类中,每个对象都是类的实例 (Instance),它们都可使用类中的函数。
类图
- 类图用来描述系统的结构。类图描述类及类与类之间的静态关系。
- 类图是一种静态模型,它是创建其它图的基础。
- 一个系统可以由多张类图来描述,一个类也可以出现在几张类图中。
类之间的关系
1 关联
关联表示两个类的对象之间存在某种语义上的联系。
关联分为普通关联、限定关联和关联类。
普通关联是最常见的关联关系,只要类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线。
关联一般是双向的,在一个方向上为关联起一个名字,在另一个方向上为关联起另一个名字,如果关联清晰的话,也可不起名字。
在表示关联的直线两端可以写上重数(multiplicity),重数表示该类有多少个对象与对方的一个对象相连接。重数的表示方法通常有:
0..1: 表示0到1个对象;
0..或: 表示0到多个对象;
1+或1..*:表示1到多个对象;
1..15: 表示1到15个对象;
3: 表示3个对象。

限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或将多对多简化成多对一。
在类图中把限定词放在关联关系末端的一个小方框内。

为了说明关联的性质,我们还可以增加一些附加信息。这样可以引入关联类来记录这些信息。
关联中的每个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。

2 聚集
聚集是关联的特例。聚集所表示的类之间的关系是整体与部分的关系。
在需求陈述中,我们常常会使用的“包含”、“组成”、“分为……部分”等字句,这往往意味着存在聚集关系。
如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集(Aggregation)。
聚集和共享聚集的图示符号是在表示关联关系的直线末端紧挨着整体类的地方画一个空心菱形。

如果部分类完全隶属于整体类,部分类需要与整体类共存,一旦整体类不存在了,则部分类也会随之消失,或失去存在价值,则称该聚集称为组合聚集(composition),简称为“组成”。

3 泛化
泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息。
用一端为空心三角形的连线表示泛化关系,三角形的顶角紧挨着通用元素。
泛化可分成普通泛化和受限泛化两类。
没有具体对象的类称为抽象类。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。

抽象类通常都具有抽象操作。抽象操作仅用来指定该抽象类的所有子类应具有哪些行为。
与抽象类相反的类是具体类,具体类有自己的对象,并且该类的操作都有具体的实现方法。

对泛化关系,我们可以增加约束条件,以进一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。
预定义的约束有4种: 多重、不相交、完全和不完全。这些约束都是语义约束。
多重继承指的是,一个子类可同时多次继承同一个上层基类。
与多重继承相反的是单继承,即一个子类不能多次继承同一个基类。一般的继承都是单继承。

完全继承是父类的所有子类都已在类图中穷举出来了。
不完全继承则相反,父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护,这为日后系统的扩充和维护带来很大方便。不完全继承是一般情况下默认的继承关系。
4 依赖和细化
依赖关系描述两个模型元素(类、用例等)之间的语义连接关系:其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。
下图表示一个友元依赖关系,该关系使得B类的操作可以使用A类中私有的或保护的成员。

当对不同抽象层次上的同一个事物进行描述时,这些层次描述之间具有细化关系。
假设两个模型元素A和B描述同一个事物,它们分属不同的抽象层,如果B在A的基础上进行了更详细的描述,则称B细化了A。
细化用来协调不同阶段模型之间的关系,表示各个开发阶段不同抽象层次的模型之间的相关性,细化常常用于跟踪模型的演变。

实例
实例就是由某个特定类所描述的一个具体对象。对象是类的实际例子,通常称为实例。
当使用“对象”这个术语时,既可指一个具体的对象,也泛指一般的对象,但是,当使用“实例”这个术语时,必然是指一个具体的对象。
消息
消息是一个对象与另一个对象之间交互的手段,它要求某个对象执行类中定义的某个操作的规格说明。
方法
方法是对象所能执行的操作,即类中所定义的服务或操作。方法描述了对象执行操作的算法,以及响应消息的方法。
属性
属性是类中定义的数据,它是对客观世界实体所具有性质的抽象。类的每个实例都有自己特有的属性值。
- 属性的可见性(即可访问性)通常有下述3种:公有的(public)、私有的(private)和保护的(protected),分别用加号(+)、减号(-)和井号(#)表示。如果未声明可见性,则表示该属性的可见性尚未定义。
- 属性名和类型名之间用冒号(:)分隔。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。
- 在创建类的实例时应给其属性赋值,如果给某个属性定义了初值,则该初值可作为创建实例时这个属性的默认值。类型名和初值之间用等号(=)隔开。
- {}括起来的性质串明确地列出该属性所有可能的取值。

继承
继承是指能够直接获得已有事务的性质和特征,而不必重复定义它们。
继承是子类自动地共享基类中所定义数据和方法的机制。
继承性使得对象可以共享程序代码和数据结构,大大减少了程序中的冗余信息。
继承具有传递性。因此,一个类实际上继承了它所在的类等级中在它上层的全部基类的所有描述。
当一个类只允许有一个父类时,类的继承是单继承。当允许一个类有多个父类时,类的继承是多重继承。
封装
封装就是信息隐藏,通过封装对外界隐藏了对象的实现细节。这样,使用一个对象时,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。
多态性
多态性是指同样的消息既可以发送给父类对象也可以发送给子类对象,即在类等级的不同层次中可以共享一个方法的名字,不同层次中的每个类按自己的需要来实现这个行为。在C++语言中,多态性是通过虚函数来实现的。
重载
重载分为函数重载和运算符重载。
函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字。
运算符重载是指同一个运算符可以施加于不同类型的操作数上面。
重载进一步提高了面向对象系统的灵活性和可读性。
面向对象方法的开发过程
面向对象方法改进了在生存期各个阶段之间的接口,因为在生存期各个阶段所开发出来的“部件”都是类。
在面向对象生存期的各个阶段对各个类的信息进行细化,类成为分析、设计和实现的基本单元。
在面向对象软件开发中,复用扮演了重要角色。软件部件应当独立于当初开发它们的应用而存在。
部件的开发瞄准某些局部的设计和实现,它们能够帮助当前问题的解决,但为了在以后的项目中使用,它们还应当足够通用。
类就是一个希望能够复用的单元,因此,提出了一个“类生存期”。
类生存期是与应用生存期是交叉的。即就是说,类的标识是应用生存期的一个阶段,但类生存期的步骤独立于任一特殊应用的开发。
类的开发应能完整地描述一个基本实体。而不仅仅考虑当前正在开发的系统。
二、面向对象建模
建模
模型是为了理解事物而对该事物做出的一种抽象,是对事物的一种无歧义的书面描述。由于模型忽略了事务的非本质东西,因此模型比原始事务更容易操纵。
建模的目的就是将一个系统或者子系统的本质抽象出来。建模过程是处理各类复杂性系统的手段。
建模过程意味着要构造一个抽象系统,该抽象系统表达了建模者对系统感兴趣的方面,同时建模者忽略掉了无关的细节。
通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。
在模型建立之后,该模型就要经受用户和各个领域专家的严格审查。由于模型的规范化和系统化,因此比较容易暴露出系统分析员对目标系统认识的片面性和不一致性。
模型审查的一种有效技术是建立该模型的原型,用户和领域专家通过亲身体验该原型,从而对系统模型进行更有效的审查。

统一建模语言UML
UML的特点
统一标准
- 融合了当前一些流行的面向对象开发方法的主要概念和技术,成为一种面向对象的标准化的统一建模语言。 提供了标准的面向对象的模型元素的定义和表示法,有标准的语言工具可用。
- 已成为工业标准化组织OMG的正式标准。
面向对象
- 支持面向对象的主要概念,提供了一批基本的模型元素的表示图形和方法。
可视化,表示能力强大
- 一种图形化语言,系统的逻辑模型和实现模型都能用UML的模型图形清晰地表示。
- 可以处理与软件的说明和文档有关的问题。
- 提供了语言的扩展机制,用户可以根据需要增加定义自己的衍型(StereoType)、标记值和约束等。
- 可用于各种复杂类型的软件系统的建模。
独立于过程
- 系统建模语言,独立于开发过程。
容易掌握使用
- 概念明确,建模表示法简洁明了,图形结构清晰,容易掌握使用。
着重学习三个方面的主要内容:
- (1) UML的基本模型元素
- (2) 组织模型元素的规则
- (3) UML语言的公共机制
与程序设计语言的关系
- 用Java,C++ 等编程语言可实现一个系统。
- 一些CASE工具可以根据 UML所建立的系统模型来产生Java、C++ 等代码框架。
UML的定义
UML定义有两个组成部分:语义和表示法。
- 语义用自然语言描述,表示法定义了UML的可视化标准表示符号,这决定了UML是一种可视化的建模语言。
- 在语义上,模型是元模型的实例。UML定义给出了语法结构的精确定义。
- 使用UML时,要从不同的角度观察系统,为此定义了概念“视图”。视图是对系统的模型在某方面的投影,注重于系统的某个方面。
UNL是一种建模语言
- 建模方法 = 建模语言 + 建模过程。建模语言定义了用于表示设计的符号(通常是图形符号);建模过程描述进行设计所需要遵循的步骤。
- 标准建模语言UML是一种建模语言,而不是一种方法,它统一了面向对象建模的基本概念、术语及其图形符号,为人们建立了便于交流的共同语言。
- 建模能力:建模方法 + 领域知识 + 实践
UML的模型图

两类、九种模型图
- 静态模型图,又称结构图
- 可视化、说明、构造和文档化系统静态特性
- 动态模型图,又称行为图
- 可视化、说明、构造和文档化系统动态特性
(1)静态图
- 类图:展示对象类、接口、及其相互合作与关联
- 包图:在UML 1.1 以后,它不再被看作一种独立的模型图
- 对象图:展示对象及其相互之间的关系
- 实现图:
- 构件图:描述部件的物理结构以及各部件之间的依赖关系;
- 配置图:定义系统中软硬件的物理构架。
(2)动态图
- 用例图: 从用户角度描述系统的行为,并指出各功能的操作者
- 状态图:描述由事件驱动的系统/对象的状态转移
- 活动图:描述活动之间的控制流
- 交互图:描述对象之间的交互情况
- 顺序图:重点描述消息发生的事件顺序
- 协作图:重点描述各个对象之间收发消息的情况

统一建模过程(UP)
UP的特征
- 用例驱动的过程
- 以体系结构为中心的过程
- 增量式的迭代过程




三、图

用例图
- 【概念】用例图是指由参与者、用例,边界以及它们之间的关系构成的用于描述系统功能的视图。
- 【目的】用来描述整个系统的功能。
用例图(use case diagram)在需求获取和分析过程中使用,以表示系统功能。
用例图从外部视点角度,关注系统的行为。一个用例描述了一个系统应提供的功能,该功能通过角色产生了一个可视的结果。
一个角色可以描述与该系统交互的任意实体(例如:一个用户、另一个系统、该系统的物理环境)。
一幅用例图包含的模型元素有系统、行为者(actor)、用例及用例之间的关系。


类图
- 【概念】 类图是一切面向对象方法的核心建模工具。类图描述了系统中对象的类型以及它们之间存在的各种静态关系。
- 【目的】用来表示类、接口以及它们之间的静态结构和关系。
在UML类图中,常见的有以下几种关系:
- 泛化(Generalization):继承的关系,,指向父类。
实线带三角形箭头
- 实现(Realization):实现的关系,,指向接口。
虚线带三角形箭头
- 关联(Association):拥有的关系,,指向被拥有者。
实线带普通箭头
- 聚合(Aggregation):整体与部分的关系。,指向整体。
实线带空心菱形
- 组合(Composition):整体与部分的关系,但不能离开整体而单独存在。,指向整体。
实线实心菱形
- 依赖(Dependency):使用的关系,即一个类的实线需要另一个类的协助。,指向被使用者。
虚线普通箭头

交互图
- 【概念】序列图根据时间序列展示对象如何进行协作。它展示了在用例的特定场景中,对象如何与其他对象交互。
- 【目的】通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。
序列图亦称为时序图或循序图或顺序图,是一种UML行为图。它通过描写叙述对象之间发送消息的时间顺序,显示多个对象之间的动态协作。它能够表示用例的行为顺序,当运行一个用例行为时,时序图中的每条消息响应了一个类操作或状态机中引起转换的触发事件。
序列图展示对象之间的交互,这些交互是指在场景或用例的时间流中发生的,序列图属于动态建模。
序列图的重点在消息序列上,也就是说,描写叙述消息是怎样在对象间发送和接收的,表示对象之间传送消息的时间顺序。
序列图的组成元素:对象、生命线、激活、消息。

状态图
UML状态图是图表本身的名称,主要用于描述对象具有的各种状态、状态之间的转换过程以及触发状态转换的各种事件和条件。
UML状态图描述了一个状态机,可以被定义为一台机器,它定义了一个对象,这些状态控制外部或内部事件的不同状态。
状态机由状态、转换、事件、活动和动作五部分组成。
- 状态:状态指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。一个状态的生命周期是一个有限的时间阶段。
- 转换:转换指的是两个不同状态之间的一种关系,表明对象在第一个状态中执行一定的动作,并且在满足某个特定条件下由某个事件触发进入第二个状态。
- 事件:事件指的是发生在时间和空间上的对状态机来讲有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态,如信号、对象额度创建和销毁等。
- 活动:活动指的是状态机中进行的非原子操作。
- 动作:动作指的是状态机中可以执行的哪些原子操作。所谓原子操作,指的是他们在运行的过程中不能被其他消息中断,必须一直执行下去,以至最终导致状态的变更或者返回一个值。

活动图
- 【概念】描述了具体业务用例的实现流程。
- 【目的】用来表示用例实现的工作流程。


构件图
- 【概念】描绘了系统中组件提供的、需要的接口、端口等,以及它们之间的关系。
- 【目的】用来展示各个组件之间的依赖关系。
UML 组件图(Component Diagram)又称为构件图,他描述的是在软件系统中遵从并实现一组接口的物理的、可替换的软件模块。
组件图 = 构件(Component)+接口(Interface)+关系(Relationship)+端口(Port)+连接器(Connector)。
UML 组件图给提供了将要建立的系统的高层次的架构视图,这将帮助开发者开始建立实现的路标,并决定关于任务分配及(或)增进需求技能。

部署图
- 【概念】描述了系统内部的软件如何分布在不同的节点上。
- 【目的】用来表示软件和硬件的映射关系。
部署图由节点以及节点之间的关系组成。
部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。
部署图通常用来帮助理解分布式系统,一个系统模型只有一个部署图。
部署图用于可视化的软件组件部署的系统中的物理组件的拓扑结构。
部署图是用来描述一个系统的静态部署视图。

四、练习
练习一
考虑一下ATM系统。至少标识出与系统交互的三个不同的参与者。
练习二
画出列车售票系统的用例图。该系统包括两个参与者:可以购买不同类型车票的旅客和中心计算机系统管理一个价格表引用数据库。用例应该包括BuyOneWayTicket、BuyWeeklyCard、BuyMonthlyCard和UpdateTariff。也应该包括意外情况:TimeOut(即旅行者等待太长时间而无法输入正确的数量)、TransactionAborted(即旅行者选择终止按钮,未完成交易)、DistributorOutOfChange和DistributorOutOfPaper。
BuyOneWayTicket、BuyWeeklyCard、BuyMonthlyCard和UpdateTariff购买单程票、购买周卡、购买月卡、更新费率
经销商缺货、经销商缺货。
练习三
按如下定义要求画出表示书的类图:“一本书由数个部分组成,每个部分由数章组成。各章又由数节组成”。画图的将注意力放在类及其关系上。
参考链接
- Author:Koreyoshi
- URL:https://Koreyoshi1216.com/article/1b5c7b13-c6a7-8034-8c41-fc529bc4bdcd
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!