PlantUML描述《分析模式》第2章“当责”(1)

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


原图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

图片

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值