热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

连载:面向对象设计精髓:理念、技术与实践(27)-动态模型构建

类模型教导我们如何定义类,而动态模型则指导我们如何实现类的功能。通常,在完成类模型设计后,才会进行动态模型的设计,因为后者依赖于前者提供的类结构。相比类模型,动态模型设计更为直观,主要因为它较少涉及复杂的设计原则或模式。

类模型教会我们如何定义类,而动态模型则指导我们如何实现类的功能。动态模型设计通常是在类模型设计完成后进行的,因为动态模型设计需要利用到已定义的类。与类模型相比,动态模型设计较为直接,主要原因是动态模型设计时并不需要应用复杂的设计原则或模式,只需根据用例模型的特点,选择合适的动态模型来表达即可。


在实际开发中,动态模型起着至关重要的作用。简而言之,如果没有动态模型,即使完成了类的设计,也无法进行编码,或者只能编写类的声明代码(如类的属性和方法名),但无法编写类的实现代码(即方法的具体逻辑)。动态模型正是用于指导我们如何编写这些具体的实现代码。


对于何时需要进行动态模型设计,这取决于个人判断。如果认为某个部分较为复杂,就需要设计;反之,如果觉得简单,则可以直接编码。这一决策往往基于个人的经验。例如,在我的实际工作中,一个中等规模的项目可能只需要设计一两个业务的动态模型,而对于小型项目,我通常会直接根据需求编码。


根据UML标准,以下是几种常见的动态模型:


【状态模型】


状态模型用于描绘对象在其生命周期内的状态变化。通过状态图,可以清晰地了解对象的不同状态及其转换条件。当对象的状态变化较为复杂时,设计状态模型尤为重要。


在UML中,状态图用于表示状态模型。


【活动模型】


活动模型用于描述工作流程或计算流程。它关注的是在完成某项任务的过程中,各个对象的角色和它们之间的交互顺序。当流程较为复杂时,设计活动模型有助于理清思路。


在UML中,活动图用于表示活动模型。


【序列模型】


序列模型用于展示对象间按时间顺序的消息交互过程。它的关键在于“时间顺序”,因此也被称为时序图或顺序图。序列模型是最常用的动态模型之一,特别适用于将用例模型或系统序列图转化为动态模型。


在UML中,序列图用于表示序列模型。


【协作模型】


协作模型用于展示基于对象间关系组织的消息交互过程。其特点在于强调“对象关系”而非时间顺序。虽然协作模型与序列模型作用类似,但在大多数情况下,序列模型因其时间顺序与用例模型步骤的一致性而更受欢迎。


在UML中,协作图用于表示协作模型。


需要注意的是,并非所有模型都是必需的,应根据实际情况选择使用。这些模型可以从用例模型中推导出来,尤其是活动模型、序列模型和协作模型,通常与用例模型一一对应,或对应某个特定分支。通常不建议在一个模型中包含多个分支,以免图形过于复杂且主题不明确。


相比之下,状态模型较为复杂,因为不能仅从单个用例或其分支直接推导出某个对象的所有状态。需要综合多个用例模型,提取与该对象状态相关的信息,再进行统一设计。


从用例模型推导出动态模型的过程是一种“分解和分配”的过程。在用例模型中,系统被视为一个“黑盒”,而在动态模型中,系统被细分为多个类。因此,需要将原本笼统分配给系统的功能和职责进一步细化,并分配给不同的类。简而言之,动态模型明确了为了实现系统的某一功能,各类需执行的任务及其顺序。


以POS机为例,假设我们基于“结账”这一用例的正常流程设计“序列模型”,则可得到相应的“序列模型”。有了这个“序列图”,编写代码时可以参照以下伪代码(实际编码会更加复杂,但方法相同):


main(){
Trade trade = new Trade();
Integer tradeId = trade.makeNewTrade(); // 创建交易
trade.addGoods(); // 添加商品
trade.calculateTotal(); // 计算总价
Receipt receipt = new Receipt();
receipt.print(trade); // 打印收据
trade.finish(); // 结束交易
}

推荐阅读
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文介绍了如何利用Apache Digester库解决硬编码问题,通过创建自定义配置文件(如Struts配置文件)来动态调整应用程序的行为。文章详细描述了使用Apache Digester将XML文档转换为Java Bean对象的过程,并提供了具体的实现步骤。 ... [详细]
  • 本文详细探讨了成为一名合格的初级Java工程师所需掌握的知识体系,以及从初级到中级乃至高级工程师的成长路径和职业发展前景。 ... [详细]
  • 北航OO单元1总结报告
    本文档详细总结了北航OO课程第一单元的学习成果,涵盖架构设计、程序结构分析、bug调试及个人心得等多个方面。 ... [详细]
  • 本文档详细介绍了Robot Framework的基础知识、安装配置方法及其实用技巧。从环境搭建到编写第一个测试用例,涵盖了一系列实用的操作指南和最佳实践。 ... [详细]
  • 本文探讨了命令模式和责任链模式在软件设计中的应用,详细介绍了这两种模式的基本概念、UML图示、主要组成部分及其优缺点。特别关注了命令模式如何通过命令转发实现调用者与接收者之间的解耦,以及责任链模式如何通过顺序传递请求来调整处理逻辑。 ... [详细]
  • 本文详细探讨了UML用例图中的两种重要关系——包含关系和扩展关系,通过具体示例解析这两种关系的应用场景及其实现方式。 ... [详细]
  • 本文继续探讨Java IO系统中的Reader与InputStream之间的关系,重点分析面向字符的IO流如何通过装饰者模式增强功能,以支持Unicode等国际化的需要。 ... [详细]
  • JobScheduler5.0源码分析
    0.JobScheduler执行代码mJobScheduler(JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE); ... [详细]
  • 在Ubuntu上通过Wine安装Photoshop CS6的详细指南
    针对专业设计师和图像处理人员,寻找能够完全替代Adobe Photoshop的开源软件往往不尽如人意。本文提供了一种解决方案,即通过Wine在Linux系统上安装Photoshop CS6,以实现更稳定的操作体验。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 行为设计模式:命令模式详解
    命令模式是一种行为设计模式,它通过将请求封装为对象,使得可以使用不同的请求来参数化客户端,支持请求的排队、日志记录以及提供命令的撤销和恢复功能。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
author-avatar
印大大
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有