要看懂设计模式,你需要懂类图(Class Diagram),也需要懂一点对象图(Object Diagram),下面介绍一些UML的必要知识,以便你学习设计模式。

属性、操作

下图简单介绍类的属性和操作。 类有属性(attributes)、操作(operations),属性和操作统称特性(features)。

下载 (40.26 KB)

7 分钟前

下图进一步详细介绍类图细节,包括:属性和操作的作用域、属性类型、参数类型、方法返回值类型等。

下载 (74.42 KB)

12 分钟前

接口、枚举

下载 (56.7 KB)

12 分钟前

抽象类

下载 (61.72 KB)

12 分钟前

继承关系

类B继承类A,如下图:

下载 (7.04 KB)

12 分钟前

抽象类被继承,如下图:

下载 (9.55 KB)

12 分钟前

实现关系

实现是指某接口被实现,而不是某类被实例化。 实现如下图:

下载 (10.46 KB)

12 分钟前

依赖关系

先看图:

下载 (8.67 KB)

12 分钟前

B依赖A,表示如果A的接口发生变化,B也需要相应地改变。

依赖的常见情况有:

1. B调用了A的方法。

2. B的方法中,使用了A为参数。

3. B的方法返回值类型为A。

引用关系

先看图:

下载 (10.88 KB)

12 分钟前

Class1有箭头指向Class2,表示Class1中含有Class2的引用。 而上图进一步明确了具体的引用方式,就是:Class1中的私有变量m_Class2的类型是Class2。

你可能会问:某类保持另外一个类的引用,一般都会调用另外一个类的方法,那么它们的关系不应该是依赖关系吗?引用关系与依赖关系有什么区别?

这个问题很好!某些情况下,某类保持另外一个类的引用,但该类不调用另外一个类的方法,而是将另外一个类的引用暴露出来,供外部调用。

例如Class1有某一属性Class2,访问该属性可获得Class2的实例:

class1 = new Class1( );

class2 = class1.Class2;

Class1虽然有Class2的引用,但它自身不调用Class2的方法,而是让外部通过熟悉获得Class2的实例。

不过很多资料及书籍对“依赖关系”及“引用关系”的解释并不到位,不同资料之间的解释甚至是互斥的。而我见到的大部分设计模式的类图都不会区分“依赖关系”和“引用关系”,大部分设计模式的类图都会画成“引用关系”,本书后面的类图也将会不区别这两者,全部画成“引用关系”。

“包含”关系

我将“包含”关系分为“弱包含”和“强包含”,下图上面的是“弱包含”,下图下面的是“强包含”,此图说明了两种包含的区别。

下载 (91.68 KB)

12 分钟前

“弱包含”和“强包含”只是我的一种俗称,学术的叫法是“聚合”和“组合”,一般资料可能会搞到你很晕,下图希望可以进一步解释清楚。

下载 (74.47 KB)

12 分钟前

设计模式的类图中不少地方会用到“包含”关系,一些资料画成“强包含”,一些资料画成“弱包含”。我个人将“强包含”看成是“弱包含”的一种特例,大部分情况下我先画成“弱包含”,有需要才转化为“强包含”。本书中的包含关系,全部都画成“弱包含”。

对象图

类实例化后就是对象(Object),表示这些对象及对象之间关系的图就是对象图。有时候需要用对象图来表示设计模式。

对象图的例子:

请看下一文……

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

www.umlonline.org创办人

最新文章

  1. gcd推导
  2. [Python]简易terminal歌词滚动播放器
  3. Supercell only provide the best games for players
  4. php源码编译常见错误解决方案
  5. HDU 2125 Local area network
  6. trackr: An AngularJS app with a Java 8 backend – Part I
  7. 【转】NI语法 JNI参考 JNI函数大全
  8. Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句
  9. css 图片 圆形显示区域
  10. 深入分析ENode的内部实现流程和关键地方的幂等设计
  11. js加密转python3
  12. 【Mybatis】一对多实例
  13. Asp: Server.mapPath() 注意事项
  14. 【转】htop使用详解--史上最强(没有之一)
  15. 基于STM32的红外遥控重点解析
  16. Linux常用基本命令(split )
  17. 在centOS 7 中安装 MySQL
  18. MyBatis源码解析之数据源(含数据库连接池简析)
  19. [性能测试]:关于消费类ISO8583协议脚本的开发
  20. 理解js中bind方法的使用

热门文章

  1. JS获取子窗口中返回的数据
  2. 我整理的PHP 7.0主要新特性
  3. 阿里社招B2B
  4. go的markdown解析库和session库
  5. 2016年湖南省第十二届大学生计算机程序设计竞赛Problem A 2016 找规律归类
  6. 阿里巴巴开源Weex 开发教程
  7. Trumbowyg - 轻量的 WYSIWYG 编辑器
  8. 推荐12款实用的 JavaScript 书页翻转效果插件
  9. EventRay UI Kit – Web & Mobile 的素材
  10. 【JavaScript】Write和Writeln的区别