连载:面向对象葵花宝典:思想、技巧与实践(27) - 动态模型设计

简介:

类模型指导我们如何声明类动态模型指导我们如何实现类


动态模型设计一般都是在类模型设计完成后才开始,因为动态模型设计的时候一般都需要用到类模型中的类。相对类模型来说,动态模型要相对简单一些,主要原因在于动态模型设计的时候没有什么设计原则和设计模式需要应用,只需要对照用例模型,根据用例模型的特点,选取一个合适的动态模型将其表述出来即可。


动态模型在实际开发过程中有非常重要的作用,简单来说,如果没有动态模型,那么你虽然完成了类设计,但还是不能编码,或者只能编写类的声明代码(类属性、方法名称),但不能写类的实现代码(方法里面的实现逻辑,即:每个方法的实现)。动态模型就是用来指导我们如何编写具体的方法的。

 

有的同学可能会有疑问:那些地方要进行动态模型设计呢

还是那句老话,你觉得比较复杂你就设计,简单你就不设计,总之:你需要你就设计

像我在实际开发中,基本上一个中等项目就一两个业务设计动态模型(小项目看到需求就编码了 :) ),其它业务看需求文档就能看出如何编码,这也是有经验和经验不足的差别。


参考UML标准,常见的动态模型如下:

【状态模型】

状态模型主要用于描述对象的生命周期的状态变化。通过状态图,我们可以了解到对象有哪些状态,状态之间如何转换,转换的触发条件等。当我们发现一个对象的状态比较复杂的时候,就需要设计对象的状态模型。

UML中使用状态图来描述状态模型


【活动模型】

活动模型主要用于描述一个工作流程或者计算流程。其关注点是在完成某项工作的过程中,系统中的哪些对象承担了什么样的任务、做了什么处理,以及这些对象之间的先后交互关系。当我们发现一个处理流程比较复杂的时候,就需要设计流程的活动模型。

UML中使用活动图来描述活动模型


序列模型

序列模型主要用于描述对象按照时间顺序组织的消息交互过程,其关键特征是强调按照“时间顺序”来组织对象的交互,所以序列图有时又称为“时序图”或者“顺序图”。序列模型是我们最常用的动态模型,特别适合将用例模型或者SSD转换为系统的动态模型

UML中使用序列图来描述序列模型


【协作模型】

协作模型主要用于描述按照对象之间的关联来组织的消息交互过程,其关键特征是强调“对象关系”来组织对象的交互。协作模型的作用和序列模型一样,只是强调的点不同,大部分的时候我们都是选择“序列模型”,因为序列模型的时间顺序很多时候和用例模型的步骤不谋而合。

UML中使用协助图来描述协作模型


注意:以上模型并不是每个都必须有的,根据实际需要选择即可


建模实践

以上这些模型都可以从用例模型推导出来,活动模型、序列模型、协作模型基本上都是和用例模型一一对应的,或者对应用例中的某个分支。一般情况下不推荐一个模型中包含多个分支,因为这样会导致图比较复杂,而且主题不突出。

 

状态模型和其它模型相比要复杂一些,因为并不能从单个用例或者单个用例分支推导出某个对象的所有状态,而需要综合多个用例模型,从中提取出和某个对象状态相关的内容,再统一设计状态模型。

 

用例模型推导出动态模型是一个“分解和分配”的过程,因为在用例模型中,系统是当做一个“黑盒”来看待的,而在动态模型中,系统不再是一个黑盒,而是分解成了一个一个的类。因此我们需要将原来笼统的划分给系统的功能和职责,进一步分解并分配给不同的类。通俗的讲,动态模型就是说:为了完成系统的XXX功能, 先需要类A做任务1,然后需要类B需要做任务2,再由类C做任务3。。。。。。依次分解下去,最终就能够实现将类串起来,相互配合,最后实现了系统的需求。

 

我们以POS机为例,假设我们基于买单这个用例的正常分支设计“序列模型”,则可以得到如下的“序列模型”:


有了上面这个“序列图”,假设我们要开始写代码,则基本可以按照如下伪码的方式实现(实际的编码肯定不会这么简单,但方法是一样):

main(){

    Trade trade = new Trade();                
    Integer tradeId =trade.makeNewTrade();  //创建
    trade.addGoods();                       //增加商品
    trade.cacuMoney();                      //计算总额
    ............//省略一大段代码
    Receipt receipt = new Receipt();        
    receipt.print(trade);                   //打印小票
	...........//省略一大段代码
	trade.finish();                         //结束
}


================================================ 
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/24269541
================================================ 


相关文章
|
机器学习/深度学习 人工智能 安全
机器学习在金融领域的应用场景(含具体案例)
机器学习在金融领域的应用场景(含具体案例)
1250 0
机器学习在金融领域的应用场景(含具体案例)
|
搜索推荐 API 决策智能
电商的强劲马达:京东商品详情API接口
在数字化商业时代,京东商品详情API接口为企业和开发者提供了丰富的数据资源和应用机会。本文深入探讨了该接口在电商平台建设、价格优化、个性化推荐、市场分析、移动应用开发和精准营销等方面的作用及其带来的商业价值和用户体验优化。
214 0
|
存储 安全 Java
Spring Boot中的OAuth2认证与授权
Spring Boot中的OAuth2认证与授权
|
Java 调度
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
文章主要讨论了服务器中常见性能问题的一些排查思路,这篇文章主要讨论了CPU负载过高,频繁GC和频繁切换上线文这三个问题。
2005 0
服务器常见问题排查(一)——cpu占用高、上下文频繁切换、频繁GC
|
SQL 机器学习/深度学习 JSON
钉钉/企业微信机器人:“Github触发器”与“Issue机器人”
众所周知,在Serverless领域中,触发器是FaaS必不可少的一部分;一个FaaS平台,他的触发器数量、质量以及类型,很可能会决定这个FaaS平台是否能成为“主流”平台;因为触发器不仅仅是一种功能的体现,更是解决普遍性业务诉求的一个重要途径;目前来看,各个云厂商所提供的触发器基本上都会包括API网关触发器、对象存储触发器、时间触发器等,当然也有厂商提供一定的消息触发器、日志触发器、甚至是一些SQL相关的触发器、CDN触发器等,那么在我们的实际生产生活中,这些表面上看起来“很基础”的触发器,是否可以升级成为一个有趣的“高级触发器”呢?
1006 0
|
JSON 测试技术 数据处理
1688商品发布框架升级,海量规则如何覆盖?
阿里QA导读:1688商品发布系统升级发品框架GPF,面对商品模型复杂度极高,发布的海量场景、多重业务逻辑如何覆盖?本文从手工测试到自动化测试,以及完善的质量保障方案一一解答。
719 0
1688商品发布框架升级,海量规则如何覆盖?
|
存储 前端开发 数据库
使用宜搭自定义页面搭建手机端应用
使用宜搭自定义页面搭建手机端应用
557 1
|
计算机视觉 索引 Python
两张脸融合在一起长啥样?Opencv-Python 来告诉你!
1,Image Morphing 介绍 图像融合简单来说,通过把图像设置为不同的透明度,把两张图像融合为一张图像(一般要求图像需要等尺寸),公式如下:
两张脸融合在一起长啥样?Opencv-Python 来告诉你!
|
存储 自然语言处理 Ubuntu
Docker unionfs(overlayfs) 实现 rootfs
Docker unionfs(overlayfs) 实现 rootfs
777 0