☰
UML建模核心:类图关系、交互图分工与设计原则落地
2026/10/18 0:10:19 网站建设 项目流程

简介:本资源是面向软件工程专业学生及系统分析设计初学者的UML核心考点复习资料,聚焦考试高频题型与易错概念辨析,助力快速掌握UML建模关键能力。压缩包为单个132KB的Word文档(.doc),内容涵盖关联多重度判定、组合关系识别、客户-订单基数表达、顺序图与协作图对比、高内聚度定义、UML九种图的分类与用途(类图/用例图/序列图/协作图等)、可见性与领域模型等12大核心知识点,并附带全部试题解析、标准答案及典型图示说明。文档结构清晰,每道题均含题干、选项、答案与原理级详解,特别强化了UML关系(依赖、关联、泛化、实现、聚集)的图示判读与业务语义映射能力。目前已有404人学习下载,适用于考前冲刺、课堂巩固及自学自测,是理解UML静态结构与动态行为建模逻辑的实用型备考材料。

1. UML系统分析与设计:一张不能只背题、必须画出来的知识地图

如果你正在刷《UML系统分析与设计复习试题》,却还在靠“记答案”硬扛——比如把“关联多重度选B”“顺序图强调时间、协作图强调结构”抄十遍,那这张知识地图你大概率没真正展开过。UML不是选择题题库,而是一套用图形语言讲清“系统长什么样”和“它怎么动起来”的双轨表达体系。整张地图横跨静态与动态两大维度:左边是类图、对象图、包图、构件图、部署图组成的结构骨架;右边是用例图、状态图、活动图、顺序图、协作图构成的行为脉络;中间由GRASP职责分配原则、设计模式、UP迭代流程这些“设计决策引擎”穿针引线。真正卡住多数人的,从来不是“画不出图”,而是分不清哪张图该在哪个阶段用、为什么此时必须用这张图、画错一个连线就让整个模型逻辑崩塌——比如把“客户-订单”的1对多关系画成依赖,或在SSD图里偷偷画出数据库表结构,这种翻车在真实建模中比比皆是。这份复习资料的价值,不在于它有多少道题,而在于它用38道典型题+12个易错场景,把UML从“画法手册”还原成“系统思维脚手架”:每道题背后都锚定一个真实建模动作(识别概念类→建领域模型→画SSD→转交互图→映射代码),每张图都在回答一个具体问题(“谁在用?”“它能做什么?”“怎么一步步做?”“谁来负责?”)。适合两类人:一是刚学完UML九种图但总在考试时混淆序列图和协作图的初学者;二是做过几个小项目却说不清“为什么这里必须用组合而不是聚合”的进阶者。现在,我们按这张地图的逻辑,一章一章拆解那些真正决定你能不能把UML用活的硬核模块。

2. 静态建模核心:类图、关联与领域模型的三层穿透

UML静态图不是摆设,它是系统设计的“地基图纸”。类图(Class Diagram)是其中最核心的一张,但很多人只停留在画三个框加属性方法的层面,忽略了它承载的三重语义:结构约束、关系语义、设计契约。下面从三个关键层展开,每层都对应高频考题和真实建模陷阱。

2.1 类图的三要素:类、关系、多重度——缺一不可的铁三角

类图由类(Class)、关系(Relationship)和多重度(Multiplicity)构成铁三角。任何缺失都会导致模型失真。以题干中“客户-订单”为例:

  • 类(Class):必须是业务域中的真实概念,如Customer、Order,而非技术实现类(如OrderDAO)。题20要求识别“顾客、POS收款台、收款员、销售、商品标识、商品、商品说明”,这正是从场景文本中提取概念类的典型过程——名词短语法(题18)。

  • 关系(Relationship):UML定义四种基础关系(题9、题7):

    • 依赖(Dependency):虚线+箭头,表示临时使用(如Order依赖PaymentService计算金额);
    • 关联(Association):实线,表示长期结构关系(如Customer与Order);
    • 泛化(Generalization):空心三角+实线,即继承(如VIPCustomer泛化Customer);
    • 实现(Realization):虚线+空心三角,接口与实现类关系(如PaymentStrategy接口被CreditCardPayment实现)。

    提示:聚集(Aggregation)和组合(Composition)是关联的特例,题2明确指出“类A由类B的一个实例和类C的1个或多个实例构成”,这属于组合关系(题2答案隐含),因为部分(B、C)生命周期依附于整体(A),用实心菱形表示。

  • 多重度(Multiplicity):这是最常错的点(题1、题3、题46/47)。它描述一个端点的实例能与另一端点多少个实例关联,不是“调用次数”或“方法数量”。题1选项B正确:“一个类的实例能够与另一个类的多个实例相关联”。题3中,“一个订单由一个且仅由一个客户提交” → 订单端多重度为1;“一个客户提交0个或多个订单” → 客户端多重度为0..*。标准写法是:1(有且仅有一个)、0..1(零个或一个)、1..*(至少一个)、0..*(零个或多个)。

下表总结高频多重度场景及建模意图:

业务场景客户端多重度订单端多重度关系类型建模意图
一个客户可下0~N个订单,一个订单只属1个客户0..*1关联表达归属约束,非强生命周期绑定
一个订单包含1~N个商品项,商品项离开订单即失效11..*组合表达强整体-部分关系,部分生命周期由整体控制
一个用户可拥有多个角色(如管理员、编辑),角色可被多个用户共享0..*0..*关联(带关联类UserRole)表达多对多关系,需引入关联类避免歧义

2.2 领域模型:从真实世界到软件概念的第一道翻译关

领域模型(Domain Model)是静态建模的起点,题15、题44、题50均指向它:“一组表示真实世界的概念类”。它不包含任何软件实现细节(如getter/setter方法、数据库字段),只聚焦业务本质。题66给出建模步骤:列出候选概念类→画领域模型图→加关联→加属性。题20的场景就是典型实践:

(1)顾客带着商品来到POS收款台 →Customer,POS,Product
(2)收款员启动销售 →Cashier,Sale
(3)输入商品标识 →ItemID(属性,非类)
(4)系统记录商品、显示说明价格 →ProductDescription,Price(属性)

这里ItemID是Sale的属性,不是独立概念类;ProductDescription和Price是Product的属性,而非单独类。易漏点:把属性误当概念类,或把技术实体(如DatabaseConnection)混入领域模型。

题44强调领域模型是“概念类”而非“软件部件的模型”,题50确认其别名为“概念模型”。这意味着建模时要不断自问:“这个东西在业务中是否真实存在?业务人员是否用这个词沟通?”例如,在银行系统中,“账户”是概念类,“AccountBalance”是属性,“TransactionLogTable”是技术实现,绝不进入领域模型。

2.3 关联的深度辨析:普通关联、聚合、组合的生死线

题2、题9(3)(4)直指关联的细分。三者区别不在画法(都是实线),而在语义强度和生命周期控制权:

  • 普通关联(Association):松散连接,双方独立存在。如Customer与Order:删除客户,订单历史仍需保留(符合审计要求)。
  • 聚合(Aggregation):空心菱形,表示“整体-部分”但部分可独立存在。如Car与Wheel:轮子可卸下装到其他车上。
  • 组合(Composition):实心菱形,表示“强整体-部分”,部分生命周期由整体完全控制。如Order与OrderLineItem:订单删除,所有明细项必须同时删除。

题2中“类A由类B的一个实例和类C的1个或多个实例构成”,关键词“由……构成”暗示组合(Composition),因为B和C作为A的组成部分,其存在完全依赖A。若题干改为“类A使用类B的服务”,则应为依赖关系。

注意:UML规范中,聚合与组合的语义常被弱化,但考试和严谨设计中必须区分。组合的实心菱形端永远是整体,多重度写在整体端(如Order端写1,OrderLineItem端写1..*)。

3. 动态建模实战:交互图、状态图与活动图的分工与转换

静态图回答“系统是什么”,动态图回答“系统做什么、怎么做”。UML九种图中,动态图占五席(用例图、状态图、活动图、顺序图、协作图),它们并非并列,而是按抽象层级和关注焦点形成协作网络。本章聚焦最易混淆的交互图(顺序图/协作图)、状态图与活动图,结合题4、题16、题17、题38、题72、题86等,拆解其不可替代性。

3.1 交互图双雄:顺序图与协作图的本质差异与转换逻辑

题4、题16、题17、题38、题72反复考查顺序图(Sequence Diagram)与协作图(Collaboration Diagram,现称通信图/Communication Diagram)的区别。核心差异不在“画法”,而在建模视角的底层哲学:

  • 顺序图:时间轴优先的“剧本”
    按垂直时间轴排列生命线(Lifeline),水平箭头表示消息。题4明确:“顺序图强调交互的时间顺序”。它天然适合回答:“系统事件发生时,对象间消息传递的精确时序是什么?”例如题21的SSD(系统序列图):makeNewSale()→enterItem()→endSale()→makePayment(),四步严格串行,每步触发特定对象状态变更。顺序图的强项是清晰表达条件分支(alt)、循环(loop)、并发(par),如支付环节可能分支为“信用卡支付”或“现金支付”。

  • 协作图:空间结构优先的“组织架构图”
    按对象间实际连接关系(关联)布局,消息用编号标注(如1: makeNewSale())。题4指出:“协作图强调收发消息的对象的组织结构”。它回答:“完成某任务时,哪些对象需要协同?它们如何连接?”例如在订单处理中,Order对象需与InventoryService(查库存)、PaymentService(扣款)、ShippingService(发货)协作,协作图直接画出这三条关联线,消息编号体现调用链。

二者可无损转换(题72),但转换后信息侧重改变:

  • 顺序图转协作图:时间轴消失,消息编号取代垂直位置,对象布局按关联关系重排;
  • 协作图转顺序图:需根据消息编号推导时序,对象按首次出现顺序从左到右排列。

下表对比关键特征与适用场景:

特征顺序图协作图
布局依据时间顺序(垂直)对象关联结构(空间)
消息表示水平箭头,无编号(时序由位置隐含)带编号的箭头(如1.1: checkStock())
分支表达alt、opt、loop框清晰用[condition]标注消息,结构稍乱
新增对象需调整垂直空间,易拥挤可自由添加,布局灵活
典型用途系统事件流分析(SSD)、算法时序验证复杂对象协作设计、微服务间调用关系

题21要求画SSD图,本质是简化版顺序图:只画边界对象(如Cashier、System)和系统外对象(如Customer),隐藏内部对象细节,专注系统与外部的交互契约。这正是UP(统一过程)中需求分析阶段的关键产出。

3.2 状态图:捕捉对象生命周期的“状态机”

状态图(State Diagram)在题86、题16中被归为“描述对象状态变化”的图。它不描述对象间交互,而聚焦单个对象在其生命周期内可能的状态、触发状态迁移的事件、以及迁移时执行的动作。题86举例:“一个特定对象的所有可能状态以及由于各种事件的发生而引起的状态间的转移”。

关键元素:

  • 状态(State):圆角矩形,如Order的Created、Paid、Shipped、Cancelled;
  • 初始状态(Initial State):实心黑圆;
  • 终止状态(Final State):同心圆;
  • 转移(Transition):带箭头线,标注事件[守卫条件]/动作,如paymentReceived[amount>=total]/processShipment()。

易错点:混淆状态图与活动图。状态图的节点是状态(名词),转移由事件触发;活动图的节点是动作(动词),边由完成条件触发。例如订单支付成功后,状态图从Created迁移到Paid;活动图则执行“验证支付→更新订单状态→发送通知”这一系列动作。

3.3 活动图:工作流与并行任务的“流程引擎”

活动图(Activity Diagram)是UML中唯一支持并行流的图(题86)。它本质是面向对象的流程图,用于建模业务流程、算法逻辑、用例实现的工作流。题86强调其“描述需要做的活动、执行这些活动的顺序(多为并行的)以及工作流”。

核心符号:

  • 活动(Activity):圆角矩形,如Validate Payment;
  • 决策点(Decision Node):菱形,出口标[yes]/[no];
  • 合并点(Merge Node):菱形,汇合多条流;
  • 分叉(Fork)/汇合(Join):粗横线,表示并行开始/结束。

题86指出高层活动图用于“分析用例、理解多线程及并行”,低层用于“表示类的方法”。例如“处理订单”用例的活动图:分叉为“验证库存”、“验证支付”、“生成发票”三个并行活动,全部完成后汇合,再执行“更新订单状态”。

易漏点:在活动图中错误加入对象(如画出Order对象框),或混淆决策点与分叉点。决策点是单入单出的条件分支,分叉点是单入多出的并行启动。

4. 设计原则与模式:GRASP、SOLID与GoF模式的落地锚点

UML图是骨架,设计原则与模式是血肉。题6、题24、题35、题42、题52、题83等将GRASP、高内聚、设计模式等融入考题,揭示一个事实:没有设计原则指导的UML建模,只是漂亮的涂鸦。本章聚焦三大支柱——GRASP(职责分配)、SOLID(面向对象设计)、GoF模式(具体解决方案)——并明确它们在UML图中的落点。

4.1 GRASP:五条黄金法则如何驱动类图与交互图设计

GRASP(General Responsibility Assignment Software Patterns)是职责分配的元模式,题24详述其五原则。它们不是抽象理论,而是直接决定类图中类的职责划分、交互图中消息流向的决策引擎。

GRASP原则解决的问题UML图中体现题干例证
信息专家(Information Expert)职责该分配给谁?→ 给拥有最多相关信息的类类图中,Order类拥有totalAmount属性,故calculateTotal()方法应在此类;交互图中,Order接收calculateTotal()消息题6、题24
创建者(Creator)谁负责创建新实例?→ 给包含初始化数据或记录聚合关系的类类图中,Order与OrderLineItem为组合关系,则Order应有addLineItem()方法;交互图中,Order发送createLineItem()消息题24
低耦合(Low Coupling)如何降低依赖?→ 减少类间直接引用,通过接口或中介类图中,Order不直接依赖PaymentProcessor,而依赖PaymentStrategy接口;交互图中,Order向PaymentStrategy发送消息,而非具体实现类题24、题35(策略模式)
高内聚(High Cohesion)如何保持类职责集中?→ 一个类只做高度相关的事类图中,Order类只包含订单相关属性(orderDate,status)和方法(addItem(),calculateTotal()),不包含sendEmail()(应属NotificationService)题6、题83
控制器(Controller)谁处理系统事件?→ 给代表用例或会话的非UI、非实体类交互图中,SalesController(非Cashier或Order)接收makeNewSale()系统事件,并协调后续对象题24、题21(SSD中System即控制器)

题21的SSD图中,System对象接收所有系统事件(makeNewSale(),enterItem()),这正是控制器模式的体现——它不持有业务数据,只负责协调,确保UI与领域逻辑解耦。

4.2 SOLID原则:UML图中看不见却致命的设计红线

SOLID是面向对象设计的五大原则,虽未在题干中直接命名,但题35(适配器、策略、单例)、题42(UP初始阶段不定义大多数需求)等均隐含其精神。它们是检验UML设计质量的X光机:

  • 单一职责(SRP):一个类只有一个改变的理由。类图中,若Order类既有订单逻辑又有邮件发送逻辑,即违反SRP。
  • 开闭原则(OCP):对扩展开放,对修改关闭。题22问“Open-Close原则”,答案即此。策略模式(题35)是典型实现:增加新支付方式(如AlipayStrategy),只需新增类,无需修改Order。
  • 里氏替换(LSP):子类可替换父类。类图中,若VIPCustomer重写了calculateDiscount()使其返回负数,破坏了Customer契约,则违反LSP。
  • 接口隔离(ISP):客户端不应依赖不需要的接口。类图中,若PaymentService接口包含processCreditCard()和processCash(),而CashOnlySystem只用后者,则应拆分为CreditCardPayment和CashPayment接口。
  • 依赖倒置(DIP):依赖抽象,不依赖具体。类图中,Order依赖PaymentStrategy接口,而非CreditCardProcessor类。

4.3 GoF设计模式:从UML图到代码的“标准翻译模板”

题35、题52明确考查适配器、策略、组合、单例、工厂方法等模式。它们是解决特定设计问题的标准化方案,UML图是其最佳表达载体。以策略模式为例(题35):

# 策略模式UML类图核心:抽象策略类 + 具体策略类 + 上下文类 # 抽象策略 class PaymentStrategy: def pay(self, amount): pass # 具体策略 class CreditCardPayment(PaymentStrategy): def pay(self, amount): print(f"Paid {amount} by credit card") class CashPayment(PaymentStrategy): def pay(self, amount): print(f"Paid {amount} by cash") # 上下文(持有策略引用) class Order: def __init__(self, strategy: PaymentStrategy): self._strategy = strategy # 依赖抽象 def process_payment(self, amount): self._strategy.pay(amount) # 委托给策略

UML图中:PaymentStrategy为抽象类(斜体),CreditCardPayment和CashPayment为其实现类,Order与PaymentStrategy为关联(带<<use>>构造型),多重度1。题35的“解决方案”正是这段代码的UML映射。

其他模式关键UML特征:

  • 单例(Singleton):类图中getInstance()为静态方法,构造函数私有(-前缀);
  • 适配器(Adapter):类图中Adapter类同时继承Adaptee并实现Target接口;
  • 组合(Composite):Component抽象类,Leaf(原子)和Composite(容器)均继承它,Composite含children: List<Component>属性。

5. 易错点深挖:那些阅卷老师一眼揪出的12个致命漏洞

刷题时“感觉都懂”,一到考场就栽跟头?不是知识点没掌握,而是掉进了UML建模的“认知暗坑”。这些易错点往往藏在题干细微处,或源于对UML语义的惯性误解。梳理下来会发现,80%的失分源于同一类疏忽:混淆图的抽象层级、错用关系语义、忽略建模阶段约束。以下是12个血泪经验总结的致命漏洞,每条按“易漏点→为什么漏→怎么补”结构给出可操作方案。

5.1 静态图易错:类图、对象图、包图的边界失守

易漏点1:在类图中画出具体对象(如customer1: Customer)
→ 为什么漏:混淆类图(Class Diagram)与对象图(Object Diagram)。类图描述类的结构(Customer有name属性),对象图展示某一时刻的实例快照(customer1: Customer的name="Alice")。题86明确定义:“对象图表达了系统的静态设计视图或静态过程视图...与类图作用相同”,但它是实例级。
→ 怎么补:画类图时,所有元素必须是类名(Customer),绝不用冒号语法(customer1: Customer)。若题目要求“画出某时刻对象状态”,才用对象图。

易漏点2:把聚合/组合关系的多重度标在错误一端
→ 为什么漏:记反了菱形端的含义。聚合(空心菱形)和组合(实心菱形)的菱形端永远是整体,多重度应标在整体端,表示“一个整体可以包含多少部分”。题2中“类A由类B的一个实例构成”,A是整体,B是部分,故A端多重度为1,B端为1(因“一个”)。
→ 怎么补:画完关系线,先标菱形在哪一端,那一端就是整体,多重度写在它旁边。口诀:“菱形在哪,哪就是家”。

易漏点3:在领域模型中加入技术类(如DatabaseConnection、Logger)
→ 为什么漏:领域模型(题15、题44)要求“真实世界的概念类”,但开发者习惯性把实现细节带入。题50明确其别名是“概念模型”,而非“设计模型”。
→ 怎么补:建模时手持“业务词典”,只保留业务人员日常使用的名词。Customer、Order合格;JDBCConnection、HibernateSession不合格。

5.2 动态图易错:交互图、状态图、活动图的职责错位

易漏点4:顺序图中生命线画错顺序,导致消息逻辑混乱
→ 为什么漏:顺序图的生命线顺序无强制规定,但按交互发起者到被调用者的自然流向排列(如Customer→System→Order)能极大提升可读性。题21的SSD图,Cashier作为发起者应在最左。
→ 怎么补:画图前先列消息流:Cashier发makeNewSale()→System处理→System创建Sale。按此顺序从左到右排生命线。

易漏点5:协作图中消息编号遗漏或重复,破坏时序
→ 为什么漏:协作图不显式画时间轴,全靠编号1,2,3表示顺序。题45明确“通过消息编号表示时间顺序”,但考生常忘记编号或编错(如1.1,1.2后直接3)。
→ 怎么补:画完所有消息线,用铅笔按调用顺序从1开始编号,检查是否连续。分支消息用1.1,1.2,循环用2*。

易漏点6:状态图中把动作(Action)当状态(State)
→ 为什么漏:状态图节点必须是稳定状态(如Paid,Shipped),而sendEmail()是瞬时动作。题86强调“状态图展示对象的所有可能状态”,动作属于转移上的/action。
→ 怎么补:问自己:“这个东西能持续存在一段时间吗?”能→状态;不能→动作,写在转移线上。

易漏点7:活动图中用决策点(菱形)表示并行,用分叉(粗线)表示条件分支
→ 为什么漏:符号功能记反。决策点是单入单出的条件判断([paid?]),分叉是单入多出的并行启动(如同时校验库存和支付)。题86说“分叉用于并行”。
→ 怎么补:画图时,凡看到“同时做A和B”,必用分叉;凡看到“如果A则做B,否则做C”,必用决策点。

5.3 设计原则易错:GRASP、SOLID与模式的误用

易漏点8:GRASP控制器模式中,把UI类(如CashierUI)当控制器
→ 为什么漏:题24定义控制器是“处理系统事件”的类,但UI类负责展示,不负责协调业务逻辑。题21的SSD中System是控制器,它接收makeNewSale()并调用Sale类方法。
→ 怎么补:控制器必须是非UI、非实体的协调类,命名常含Controller、Handler、Coordinator。

易漏点9:策略模式中,上下文类(Context)直接依赖具体策略类
→ 为什么漏:题35方案强调“定义一系列算法,把他们封装起来,并使他们可以互相替换”,这要求上下文依赖抽象策略接口。若Order直接new CreditCardPayment(),则无法替换。
→ 怎么补:类图中,Order与PaymentStrategy(抽象类/接口)关联,而非与CreditCardPayment关联。

易漏点10:单例模式中,构造函数未设为私有,或getInstance()非静态
→ 为什么漏:单例核心是“严格一个实例”,若构造函数公有,任何类都能new;若getInstance()非静态,需先有实例才能调用,悖论。题35方案要求“定义一个静态的返回单例的类方法”。
→ 怎么补:类图中,构造函数前加-(私有),getInstance()前加+(公有)和{static}构造型。

易漏点11:用例图中,把系统内部组件(如PaymentService)当Actor(参与者)
→ 为什么漏:Actor必须是系统外部的人或事物(题17、题38),与系统交互。PaymentService是系统内部模块,应是用例的实现者,而非Actor。题12的电话用户(PhoneUser)是Actor,TelephoneCard和ThirdPartyPayment是用例。
→ 怎么补:Actor图标(小人)只出现在系统边界外。系统内部所有东西,无论多重要,都不能画成Actor。

易漏点12:UP阶段中,混淆“细化阶段”与“构造阶段”的核心任务
→ 为什么漏:题41、题42、题60指出,定义大多数需求在细化阶段(Elaboration),而构造阶段(Construction)是“迭代实现系统其余部分”。考生常误以为需求定义贯穿全程。
→ 怎么补:UP四阶段口诀:“初始定愿景,细化抓需求,构造写代码,提交去部署”。需求冻结点在细化阶段末。

6. 复习清单与查漏补缺:一份可执行的UML能力自检表

复习不是从头再看一遍书,而是用一套精准的“探测器”扫描自己的知识盲区。这份清单基于38道真题、12个易错点和UML建模全流程,设计为可逐项打钩的行动指南。它不追求覆盖所有细节,而是聚焦那些“一旦出错,整张图就废掉”的关键节点。从今天起,每次画UML图前,强制走一遍这份清单——它曾让我在模拟项目X中,避免了三次因多重度标错导致的接口返工。

6.1 静态建模能力自检(类图/领域模型/包图)

拿出一张白纸,按以下步骤操作,每步完成后打钩:

  1. 【概念类识别】

    • 给一段业务描述(如题20:“顾客带着商品来到POS收款台…”),圈出所有名词短语;
    • 划掉明显的技术词(如“数据库”、“API”)、动词(如“提交”、“输入”)、形容词(如“新的”);
    • 剩余名词中,剔除冗余(如“商品”和“商品标识”选“商品”,因标识是其属性);
    • ✅ 得到Customer,POS,Cashier,Sale,Product。
  2. 【类图关系判定】

    • 对任意两个概念类(如Customer和Order),问:
      • 它们是否长期共存?→ 是,用关联;
      • 是否“由…构成”且部分生命周期依附整体?→ 是,用组合(实心菱形);
      • 是否“使用”但无结构关系?→ 是,用依赖(虚线);
      • 是否“是…的一种”?→ 是,用泛化(空心三角)。
    • ✅ 为Customer-Order标出关联线,Customer端0..*,Order端1。
  3. 【多重度验证】

    • 对已画关联线,检查两端多重度:
      • Customer端:一个客户能否有0个订单?→ 是,0..*;
      • Order端:一个订单能否没有客户?→ 否,必须有1个,1;
      • 若为组合(如Order-OrderLineItem),整体端(Order)多重度必为1。
    • ✅ 所有多重度均符合业务规则,且菱形端为整体。
  4. 【领域模型净化】

    • 检查图中每个类:
      • 业务人员是否用这个词沟通?→ 是;
      • 是否包含saveToDB()、logError()等技术方法?→ 否;
      • 是否有id、createdAt等纯技术属性?→ 否(id可保留,但createdAt属实现细节)。
    • ✅ 全图无技术实现痕迹,100%聚焦业务概念。

6.2 动态建模能力自检(交互图/状态图/活动图)

用题21的SSD场景(makeNewSale()→enterItem()→endSale()→makePayment())实操:

  1. 【SSD图构建】

    • 画出边界:左侧Cashier(Actor),右侧System(边界对象),中间Customer(外部对象);
    • Cashier生命线发makeNewSale()消息至System;
    • System生命线发enterItem(itemID,quantity)至自身(因是系统内部操作);
    • ✅ 无内部对象(如Sale类)出现,严格遵循SSD“黑盒”原则(题51)。
  2. 【顺序图转协作图】

    • 将SSD图中Cashier、System、Customer按关联关系布局(Cashier与System关联,System与Customer关联);
    • 将makeNewSale()标为1: makeNewSale(),enterItem()标为2: enterItem();
    • ✅ 所有消息有编号,布局反映实际协作关系,无时间轴。
  3. 【状态图精炼】

    • 为Order类画状态:Created→Paid→Shipped→Delivered;
    • 转移标注:paymentReceived事件触发Created→Paid;
    • Paid状态内加内部转换:[inventoryLow]/notifyWarehouse();
    • ✅ 无动作节点,所有转移有明确事件触发。
  4. 【活动图并行验证】

    • 为“处理订单”画活动图:起始节点→分叉→Validate Inventory、Process Payment、Generate Invoice→汇合→Update Status→结束;
    • 决策点仅用于条件(如[paymentSuccess?]),分叉仅用于并行;
    • ✅ 分叉/汇合成对出现,无孤立分叉。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询