原图2.1

EA绘制

图2.1 通讯录的初始模型。
这个模型展示了人和组织的相似责任。
PlantUML
@startuml
left to right direction
skinparam ranksep 80
skinparam nodesep 80
class 人
class 公司
class 电话号码
class 地址
class 电子邮件地址
人 "0..1" -- "0..*" 电话号码
电话号码 "0..*" -- "0..1" 公司
人 "0..1" -- "0..*" 地址
地址 "0..*" -- "0..1" 公司
人 "0..1" -- "0..*" 电子邮件地址
电子邮件地址 "0..*" -- "0..1" 公司
@enduml

原图2.2

EA绘制

图2.2 使用当事者来泛化之后的图2.1 。
很多用到人或组织的情形,应该使用当事者。
PlantUML
@startuml
class 当事者
class 人
class 组织
class 电话号码
class 地址
class 电子邮件地址
当事者 <|-- 人
当事者 <|-- 组织
当事者 "1" -- "0..*" 电话号码
当事者 "1" -- "0..*" 地址
当事者 "1" -- "0..*" 电子邮件地址
@enduml

原图2.3

EA绘制

图2.3 用显式级别表示的组织结构。
这样一个结构不灵活又难以复用。
PlantUML
@startuml
left to right direction
class 经营单位
class 地区
class 分部
class 销售办事处
经营单位 "1" -- "0..*" 地区
地区 "1" -- "0..*" 分部
分部 "1" -- "0..*" 销售办事处
@enduml

原图2.4

EA绘制

图2.4 带层级关系的组织超类型。
层级关联提供了最大的灵活性。级别导致的约束必须作为规则添加在子类型上。
PlantUML
@startuml
skinparam ranksep 20
skinparam nodesep 80
left to right direction
class 组织
class 经营单位
class 地区
class 分部
class 销售办事处
经营单位 --|> 组织
地区 --|> 组织
分部 --|> 组织
销售办事处 --|> 组织
组织 "-母 0..1" -- "-子女s 0..*" 组织
note left of 经营单位
约束:
母->isEmpty()
end note
note left of 地区
约束:
母.oclIsTypeOf(经营单位)
end note
note left of 分部
约束:
母.oclIsTypeOf(地区)
end note
note left of 销售办事处
约束:
母.oclIsTypeOf(分部)
end note
note bottom of 组织
约束:
not 母.closure(母)->includes(self)
end note
@enduml

原图2.5

EA绘制

图2.5 两个组织层级结构。
组织的子类型未展示。如果有很多层级结构,这个模型将很快失控。
PlantUML
@startuml
skinparam linetype ortho
class 组织
组织 "-销售母 0..1" -up- "销售子s 0..*" 组织
组织 "-产品母 0..1" -left- "-产品子s 0..*" 组织
note right of 组织
约束:
(not 销售母.closure(销售母)->includes(self)) and
(not 产品母.closure(产品母)->includes(self))
end note
@enduml

原图2.6

EA绘制

图2.6 使用类型化关系。
组织之间的每一个关系都由一个组织结构类型定义。如果有很多个关系,这样做比显式关联更好。
PlantUML
@startuml
left to right direction
skinparam ranksep 40
skinparam nodesep 80
class 组织结构类型
class 组织结构
class 时间段
class 组织
class 经营单位
class 地区
class 分部
class 销售办事处
组织结构类型 "1" -- "0..*" 组织结构
时间段 "1" -- "0..*"组织结构
组织结构 "0..*" -- "-母1" 组织
组织结构 "0..*" -- "-子1" 组织
组织 <|-- 经营单位
组织 <|-- 地区
组织 <|-- 分部
组织 <|-- 销售办事处
@enduml

原图2.7

EA绘制

图2.7 给图2.6添加规则。
该规则强制执行约束,例如销售办事处向分部汇报。
PlantUML
@startuml
skinparam ranksep 100
skinparam nodesep 140
class 组织结构类型
class 组织结构
class 时间段
class 规则
class 组织
class 经营单位
class 地区
class 分部
class 销售办事处
组织结构类型 "1" -- "0..*" 组织结构
组织结构 "0..*" -- "1" 时间段
组织结构类型 "0..*" -- "1" 规则
组织结构 "0..*" -- "-母1" 组织
组织结构 "0..*" -- "-子1" 组织
经营单位 -left-|> 组织
地区 --|> 组织
分部 --|> 组织
销售办事处 -up-|> 组织
@enduml

678

被折叠的 条评论
为什么被折叠?



