为什么 class 一次是虚线,一次是普通线?
Why does the class have a dashed line once and a normal line once?
我有一个任务需要我根据描述画一个UML图。我已经收到解决方案(见照片)。但是,我无法找出解决方案并且有几个问题为什么解决方案是这样的。我在下面描述了这些。
描述:
预付费单元的合同 phone 应该被建模和实施。基本合同有合同号(int 类型)和余额(double 类型),但没有月费。合约编号不会自动生成,而是由构造函数设置为参数以及初始余额。天平有一个 getter 和一个 setter。
可以将以下选项添加到合同中(如果需要也可以多次):
- 100 MB 数据(每月收费 1.00 欧元)
- 50 条短信(每月收费 0.50 欧元)
- 50 分钟(月费 1.50 欧元)
- 双倍传输率(月费 2.00 欧元)
在装饰器模式的帮助下实现这个需求。所有合约元素都应该能够理解方法
getCharges():double
、getBalance():double
和 setBalance (double)
.
方法 getCharges()
应提供合同的每月费用,并选择其所有选项。 getBalance()
和 setBalance(…)
方法应该通过并访问基础合约。
运动:
- 用所有 classes/interfaces 和它们的关系画一个 UML-Diagram,
字段和方法(不需要构造函数)。
- 同时提供持有合同的客户class。
解决方案:
问题:
- 为什么
Option
曾经有一条虚线和一条正常的线到Contract
?
- 为什么
Minutes
没有像 Data
和 SMS
那样列为 class?
- 为什么
Phone
和 DoubleTransfer
与其他 class 没有联系?
初步评论
这张图存在严重的不一致:
- 要么
Contract
是一个 抽象 class(斜体名称),其他 class 可以是 BasicContract
专门化它(继承,从 BasicContract
到 Contract
的纯线,以及 Contract
端的空心三角形。
- 或者
Contract
是一个 接口 (关键字 «Interface»
在 classifier 的名称之前,或者作为 lollipop),并且classBasicContract等es可以实现(实现,虚线但Contract
端空心三角)
还有一个严重的歧义:因为至少一个空心三角形被一个微小的普通箭头所取代,所以不清楚其他箭头是否是箭头(即可导航关联)或者它们是否意味着是空心三角形(即继承)。
假设界面场景,假设Option
和Contract
之间的箭头是可导航的关联;
选项的双线
选项实现了 decorator design pattern。这意味着它实现了 Contract
接口(虚线 + 空心箭头),但它向关联的 Contract
(普通线,带或不带小普通箭头)增加了责任。
两点说明:
很多时候,您会发现装饰器是用聚合而不是关联建模的。这没有错,但确实没有必要。
不幸的是,这个装饰器似乎没有添加任何责任。到原来的合同。这很奇怪,只有当 Data
和 SMS
是 Option
的特化时才有意义,但是话又说回来,我们遇到了箭头不一致的问题(应该是空心三角形不是小的普通箭头),使这个“解决方案”非常模棱两可,而且达不到人们期望的“解决方案”的水平。
其他问题
缺失的Minutes
是一个有趣的问题。实际上,可以添加 class Minute
,并将其用作属性或操作的类型。令人惊讶的是,Euros
和 MegaBytes
也没有建模。所有这些类型有什么共同点?
Phone
和 Double Transfer
缺失的链接确实很奇怪。也许作者 运行 墨水用完了,或者使用了最多允许 6 个连接器的 UML 编辑器的有限演示版?可能就像 SMS
和 Data
,但交叉检查叙述以确保。
我有一个任务需要我根据描述画一个UML图。我已经收到解决方案(见照片)。但是,我无法找出解决方案并且有几个问题为什么解决方案是这样的。我在下面描述了这些。
描述:
预付费单元的合同 phone 应该被建模和实施。基本合同有合同号(int 类型)和余额(double 类型),但没有月费。合约编号不会自动生成,而是由构造函数设置为参数以及初始余额。天平有一个 getter 和一个 setter。 可以将以下选项添加到合同中(如果需要也可以多次):
- 100 MB 数据(每月收费 1.00 欧元)
- 50 条短信(每月收费 0.50 欧元)
- 50 分钟(月费 1.50 欧元)
- 双倍传输率(月费 2.00 欧元)
在装饰器模式的帮助下实现这个需求。所有合约元素都应该能够理解方法
getCharges():double
、getBalance():double
和setBalance (double)
.
方法 getCharges()
应提供合同的每月费用,并选择其所有选项。 getBalance()
和 setBalance(…)
方法应该通过并访问基础合约。
运动:
- 用所有 classes/interfaces 和它们的关系画一个 UML-Diagram, 字段和方法(不需要构造函数)。
- 同时提供持有合同的客户class。
解决方案:
问题:
- 为什么
Option
曾经有一条虚线和一条正常的线到Contract
? - 为什么
Minutes
没有像Data
和SMS
那样列为 class? - 为什么
Phone
和DoubleTransfer
与其他 class 没有联系?
初步评论
这张图存在严重的不一致:
- 要么
Contract
是一个 抽象 class(斜体名称),其他 class 可以是BasicContract
专门化它(继承,从BasicContract
到Contract
的纯线,以及Contract
端的空心三角形。 - 或者
Contract
是一个 接口 (关键字«Interface»
在 classifier 的名称之前,或者作为 lollipop),并且classBasicContract等es可以实现(实现,虚线但Contract
端空心三角)
还有一个严重的歧义:因为至少一个空心三角形被一个微小的普通箭头所取代,所以不清楚其他箭头是否是箭头(即可导航关联)或者它们是否意味着是空心三角形(即继承)。
假设界面场景,假设Option
和Contract
之间的箭头是可导航的关联;
选项的双线
选项实现了 decorator design pattern。这意味着它实现了 Contract
接口(虚线 + 空心箭头),但它向关联的 Contract
(普通线,带或不带小普通箭头)增加了责任。
两点说明:
很多时候,您会发现装饰器是用聚合而不是关联建模的。这没有错,但确实没有必要。
不幸的是,这个装饰器似乎没有添加任何责任。到原来的合同。这很奇怪,只有当
Data
和SMS
是Option
的特化时才有意义,但是话又说回来,我们遇到了箭头不一致的问题(应该是空心三角形不是小的普通箭头),使这个“解决方案”非常模棱两可,而且达不到人们期望的“解决方案”的水平。
其他问题
缺失的Minutes
是一个有趣的问题。实际上,可以添加 class Minute
,并将其用作属性或操作的类型。令人惊讶的是,Euros
和 MegaBytes
也没有建模。所有这些类型有什么共同点?
Phone
和 Double Transfer
缺失的链接确实很奇怪。也许作者 运行 墨水用完了,或者使用了最多允许 6 个连接器的 UML 编辑器的有限演示版?可能就像 SMS
和 Data
,但交叉检查叙述以确保。