面向对象设计第六话

系统对象和类分析

静态分析阶段(定义类的关系以及对象的关系)

关联和链接
1) 关联——针对类而言,表示类之间的使用关系。
. 类的相互的使用关系称为双向关联。
. 指类图中用直线表示的关系;
. 线可以是水平也可以是垂直的;
. 可以在关系线上给一个逻辑名称描述这个关系;
2) 链接——针对对象而言
. 指对象图中二个对象间的关系;

类的关联
1)一个类中的属性是另一个类的对象,另一个类中也有这个类的对象作为其属性。(双向关联)"has a"(一对一关联)
2)一个类中包含另一个类的多个对象(集合)作属性,另一个类中也有这个类的一个对象作为其属性。(一对多关联)
3)一个类中包含有另一类的多个对象(集合)作属性,另一个类中同样也有这个类的多个对象作属性。(多对多关联),
以上所介绍的关联关系都是双向关联。

多对多关联是复杂的关联关系,要是用关联类来把多对多转变成两个一对多关系,也可以通过在多对多关联中的类中加上一个唯一标识对象的键值,

关联和多样性
1) 多样性显示了一个类中对象和另一个类中对象联系的可能性;
2) 在类图中,每个类只有一个矩形,因此联接会确定一个类有多少个对象链接于另一个类的对象;
3) 联接线的末端有标记;

多样性的值
1) 2: 刚好二个;(确定值)
2) *: 0至多个; (不确定值)
3) 5..15: 5到15个; (范围值)
4) 2,4,6: 2、4、6个; (可选值)
5) 10..*: 最少10个;
6) 0..10: 最多10个;

复杂性的联接
1) 多样性标记“*”出现在联接的两端;
2) 你命名了类图中所有联接并分配了多样性后,是时候重新审视他们并尝试解决复杂联接。可使用联接类或符合条件联接。

关联类(类似于数据库中索引表)
1) 这意味着联接它本身必须编码为一个类,这个类带有解决冲突的属性;
2) 这种技术用于分析阶段解决多对多关系;

符合条件的联接
1) 通过使用属性值可解决多对多问题;
2) 分配一个唯一的属性值;

依赖,一个类,通过类中的方法包含另一个类的对象,并通过此对象调用另一个类中的方法,方法参数就是一个类对另一个类发送的消息(也可能是对象)。

分析阶段的逻辑关系

1) 在一个系统中必须存在一些关系以便进行适当地操作;
2) 逻辑关系表达了一个类和另一个类如何关联、一个对象怎样得到或使用另一个对象;
3) 问下列问题:
. 一个类依赖于另一个类的某些功能吗?
. 是否存在一种非常强的关系以致一个对象缺少了另一个便不能存在?
4) 在这个模块讨论的逻辑关系如下:
. 继承(Inheritance):
a. 一般,(泛化)父类,子类的泛化,也就是抽取共性,抽象
b. 特殊,(特化)子类,父类的特化,也就是在泛化抽象中加上了某种特性,特化
. 多态(Polymorphism)
. 关联(Association)
a. 聚合(Aggregation)
b. 组合(Composition)

继承(Inheritance)
1) 继承的概念描述了你如何在一组类似或相同目的类间共享或得到属性以及功能;
2) 单继承和多重继承;
3) 使用继承,我们能够 :
. 降低全部系统的尺寸;
. 改善设计和维护的功能;
4) Car、Bus、Train、Airplane、Ship, 他们都是交通工具。他们可以移动以及驾驶,它们可以将人从A地运往B地。

子类和父类
1) 当一个类继承自其它类,它被称为“子类”;
2) 当一个类被继承自其它类,它被称为“父类”;

注意:如果继承关系没有处理好,在使用多态上就会出现问题,所以要正确的处理继承关系。

继承分析

继承的二种类型:
. 一般继承:

|ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Dog | | Cat | | Mammal |
|__________| |__________| |__________|
|-numLegs | |-numLegs | ——> |-numLegs |
|ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ|
|+eat() | |+eat() | |+eat() |
|+bark() | |+meow() | |__________|
|__________| |__________| △

|ˉˉˉˉˉˉˉˉˉˉ|
| |
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Dog | | Cat |
|__________| |__________|
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
|+bark() | |+meow() |
|__________| |__________|

. 特殊继承:

|ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Mammal | | Mammal |
|__________| |__________|
|-numLegs | |-numLegs |
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
|+eat() | |+eat() |
|__________| |__________|
△ ——> △
│ │
|ˉˉˉˉˉˉˉˉˉˉ| |ˉˉˉˉˉˉˉ|ˉˉˉˉˉˉ|
| | | | |
|ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Dog | | Cat | | Dog | | Cat | | Sheep |
|__________| |__________| |__________| |__________| |__________|
|ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ| |ˉˉˉˉˉ|
|+bark() | |+meow() | |+bark() | |+meow() | |+baa() |
|__________| |__________| |__________| |__________| |__________|

多态
1) 是一个和继承关系密切的OO术语;
2) 多态这个名字来源于希腊,意思是“多种形态”;
3) 从分析透视图看来,多态意味着不同类型和多种属性可分配于类;
4) Java和C++支持多态;

抽象类
1) 是一些包含未实现功能的类,这些类不能实例化。一个类继承了一个抽象类继承了所有方法(包括抽象方法);
2) 任何类继承了抽象类后除非实现了所有的抽象方法,否则也是抽象的;

UML中关于抽象类的符号
1) 抽象类的类名为斜体;
2) 抽象方法名也是斜体;

角色:表示一类数据结构的关系结构,角色可以是不同的类,可以通过角色来区别不同的对象的所能够使用的功能。

反身(反射)关联(加角色)

1) 对象图中,相同类的二个实体间的联系;
2) 但是在类图中只有一个类代表这些对象;
3) 因此,这种关联回转到相同的类。这样的关联称为反身关联;
4) 反身关联在关联线的末端必须存在角色名字。这明确地说明你是如何关联这个类的二个对象。

wife
|ˉˉˉˉˉˉ|
|ˉˉˉˉˉ| |
| Person | |
|__________| |married
|ˉˉˉˉˉ| |
|__________| |
↑____________|
husband

关联(Association)
1) 关联用于描述类图中二个类间的关系;
2) 包括一些更紧密关系诸如:聚合(Aggregation)和组合(Composition)
. 联系:厨师使用刀;
. 聚合:一辆车有一个车载电台;
. 组合:一辆车一般只包括一个发动机;

|ˉˉˉˉˉ| 用刀 |ˉˉˉˉˉ|
| Chef | chops with | Knife |
|___厨师___|------------>|____刀____|
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
|__________| |__________|

聚合(Aggregation)
1) 是关联中的一种;
2) 更紧密的关联方式;
3) 聚合是一种整体/部分关系,但“部分”可以被其它对象共享(“部分可以脱离整体存在”),因而有可能在“整体”外存活。
4) 表现为“Has A”关系;

|ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Car | has a | CarRadio |
|__________| ◇-------------|__________|
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
|__________| |__________|

组合(Composition)
1) 最紧密的关联方式;
2) 表现为“always contains”关系,部分不能离开整体存在,整体也不能够缺少部分而使用 例如:车不能没有引擎
3) 在UML图上表现为一黑色的菱形

|ˉˉˉˉˉ| |ˉˉˉˉˉ|
| Car | driven by | Enginee |
|__________| ◆-------------|__________|
|ˉˉˉˉˉ| |ˉˉˉˉˉ|
|__________| |__________|

方法的扩散

方法的扩散,是建立在聚合和组合的关系之上,类和类之间的方法的调用,会造成方法的扩散,也就是类中的方法通过关联的属性来调用这个属性的类型中定义的方法,方法扩散,可以导致整体的多个部分中的方法被连锁调用。

方法的扩散:
. 代理,整体和部分的类型是同一个类别(同一父类,或实现统一接口),他们之间的方法传递叫代理 ,可以使用多态特性。
. 委托,整体和部分的类型是不同类别,他们的方法传递叫作委托。

动态模型分析

在分析阶段创建动态模型
1) 一旦在分析阶段完成对象模型建模,你可以开始对系统和对象在整个时间段内运作方式进行建模,这称为动态建模。
2) 动态建模发生二次:
. 在逻辑分析阶段(确信每个操作都是可能的)
a. 时序图(Sequence diagrams)/协作图(Collaboration diagram);
b. 状态转换图(State transition diagram);
c. 活动图(Activity diagram);
. 在物理设计阶段(分配方法描述给对应的类)
责任

在OOA&D中,“责任”指:
. 一个类知道什么(状态);
. 一个类做什么(行为);
. 一个类型知道什么(状态);
. 一个类型做什么(行为);

分配责任

在分配责任时,很重要去确定以及实现以下内容:
. 专家(指你所分配责任的类完全可实现其责任,这减小了额外对象的依赖以及支持低耦合);
. 创建者(谁应该创建一个实例);
. 高聚合(一个类的属性一起完成得很好);
. 低耦合(减少对象间的依赖性);

改变的必要
1) 一个系统中的对象存在是因为它们完成一些作务帮助系统完成它们的目标;
2) 每个任务需要一定时间完成以及需要在对象间传递一些信息;
3) 系统中的每个对象代表一组特定的活动;
4) 你也应该考虑一个操作中所调用的对象以及它们是如何交互去完成这个操作的, 一个对象所完成的每个操作或子操作是如何改变对象的内在状态的;


时序图
1) 模仿一定时间内一个系统的单个操作;
2) 每个时序图:
. 和一个用例或一个用例中的一个情景直接联系;
. 确定每个过程中所调用的对象;
. 确定在一个过程中发现的行业或事件;
. 确定在每个过程中必须传输什么信息;
. 确定每个行为后需要什么响应;
. 对于每个用例至少产生一个时序图
3) 在分析阶段,他们仅影响交互。在设计阶段,每个交互将会转为一个方法调用。
4) 一个用例至少一个时序图, 时序图可以制作得很复杂以显示一个用例的多个情景,但最好还是每个情景对应一个时序图。

协作图
1) 可以作为时序图的可选对象;
2) 对象通过标有序号的箭头连接,这些箭头显示了信息的流程;
3) 箭头从动作源指向目标对象;
4) 箭头标有序号显示了在一个情景中它们使用的顺序;
5) 协作图看上去像对象图的子集。操作中被调用的对象在图中表现为装有对象名称的盒子。


状态转换图
1) 时序图和协作图显示了在一定时间段内系统中对象是如何传递信息的;
2) 状态转换图显示了在一定时间段内一个对象是如何改变的,它的方法是如何被其它对象所调用;
3) 组成:状态和事件;
4) 箭头用于显示对象各种状态间的路径;
5) 每个箭头显示了该对象是如何完成特定事件;
乏值,也就是状态转换的临界值,状态转换的临界条件也就叫作乏值条件。
状态
1) 所有对象均有状态,任何对象的当前状态由存储于其属性中的值指示;
2) 设想一台打印机,它要么闲置、要么忙碌,打印机只有二种状态:闲置和忙碌;

事件
1) 事件是一个对象从一种状态转换到另一种状态的促进因素;
2) 事件表现为方法调用。方法是一个对象的某些或一系列改变状态的任务;
3) 当一些对象调用打印机的print()方法,状态由闲置改变为忙碌,print()方法的调用就是导致状态改变的事件;
4) 一个对象通常处于它状态中的一种,这意味着他们是稳定的。同时也意味着状态的改变应该越快越好。

|ˉˉˉˉˉ| print |ˉˉˉˉˉ|
| idle |--------------->| busy |
●----->| | | |
| |<---------------| |
|__________| eof |__________|
|
| delete



活动图
1) 显示一个对象和工作流的关系以及描述了相应的处理方法;
2) 每个用例只有一个活动图;
3) 每个活动表现为一个圆,该圆上有连接线连到下一个活动。这个连接线被称为板机(trigger);
4) 一个活动能产生多个板机,这依赖于活动的结果;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值