图解设计模式——UML


UML

UML是让系统可视化、让规格和设计文档化的表现方法,是 unified modeling language 的简称。

具体可以查看 http://ww.omg.org/uml 官方网站

类图

UML 中的类图(class diagram)用于表示类、接口、实例等之间相互的的静态关系。如下示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7C2YKyd-1662628039016)(en-resource://database/1218:1)]

该图展示了 parentclass 和 childclass 两个类之间的关系,其中空心箭头表明两者之间的层次关系。

  • 箭头由自雷指向父类,换言之,表示继承。

图中的长方形表示类,长方形内部被横线自上而下分为以下三个区域:

  • 类名
  • 字段名
  • 方法名

有时,图中除了会写出类名、字段名和方法名等信息外,还会写出其他信息(可见性、方法的参数和类型等)。反之,有时图中也会省略所有不必要的项目(因此,我们无法确保一定可以根据类图生成源程序)。

  • abstract 类(抽象类)的名字以斜体方式显示
  • static 字段(静态字段)的名字带有下划线
  • abstract 方法(抽象方法)的名字以斜体显示
  • static 方法(静态方法)的名字以下划线显示

接口与实现

为了强调接口与抽象类的相似性,类图中会以斜体方式显示接口名称。空心箭头代表了接口与实现类的关系,箭头从实现类指向接口。

UML 以 <> 表示接口。如下图所示:

展示接口与实现类的类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-01Lfkax6-1662628039018)(en-resource://database/1220:1)]

聚合

展示聚合关系的类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OoL1JlYz-1662628039018)(en-resource://database/1222:1)]

上图展示了 color(颜色)、fruit(水果)、basket(果篮)这三类之间的关系。basket 类中的 fruits 字段是可用存放 fruit 类型数据的数组,在一个 basket 类的实例中可以持有一个 color 类的实例。通俗地说就是在篮子里可以放入很多个水果,每个水果都有其自身的颜色。

我们将这种“持有”关系称为聚合。只有在一个类中持有另一个类的实例——无论是一个还是多个——它们之间就是聚合关系。就程序上而言,无论是使用数组、vector、list 或者其他实现方式,只要在一个类中持有另一个类的实例,它们就是聚合关系。

在 UML 中,我们使用带有空心菱形的实现表示聚合关系,因此可以进行联想记忆,将聚合关系想象为在空心菱形的器皿中装有其他物品。

可见性(访问控制)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpK5cEdJ-1662628039019)(en-resource://database/1224:1)]

该图标识了方法和字段的可见性。在 UML 中可以通过在方法名和字段名前面加上记号来表示可见性。

  • “+” 表示 public 方法和字段,可以从类外部访问这些方法和字段
  • “-” 表示 private 方法和字段,无法从类外部访问这些方法和字段
  • “#” 表示 protect 方法和字段,能够访问这些方法和字段的只能是该类自身、该类的子类以及同包中的类
  • “~”表示只有同包中的类才能访问的方法和字段

类的关联

可以在类名前面加上黑三角表示累之间的关联关系,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8x6cpyf1-1662628039019)(en-resource://database/1226:1)]

时序图

UML 的时序图(sequence diagram)用来表示程序在工作时其内部方法的调用顺序,以及事件的发生顺序。

类图中表示的是 “不因时间流逝而发生变化的关系(静态关系)”,时序图正好与之相反,表示的是 “随时间发生变化的东西(动态行为)”。

处理流与对象之间的协作

下图是一个时序图的例子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DJcFeQT4-1662628039019)(en-resource://database/1228:1)]

图中,右侧是时序图示例,左侧是与之对应的代码片段。

该图中共有三个实例,如图中最上方的三个长方形所示。长方形内部写有类名,类名跟在冒号(:)后面,并带有下划线。

:client、:server、:device 分别代表 client 类、server 类、device 类的实例。

如果需要,还可以在冒号(:)之前表示出实例名,如 server:Server。

每个实例都带有一个向下延伸的虚线,称为生命线,可以理解为时间从上向下流逝,上面是过去,下面是未来。生命线仅存在于实例的生命周期内。

在生命线上,有一些细长的长方形,它们表示实例处于某种活动中。

横方向上有许多箭头,请先看带有 open 字样的箭头。黑色实线箭头(->) 表示方法的调用,这里表示 client 调用 server 的 open 方法。当 server 的 open 方法被调用后,server 实例处于活动中,因此在 open 箭头处画出了一个细长的长方形。

而在 open 箭头画出的长方形下方,还有一条指向 client 实例的虚线箭头(<…),它表示返回 open 方法。在上图中,我们画出了所有的返回箭头,但是有些时序图也会省略掉返回箭头。

由于程序控制已经返回到 client,所以表示 server 实例处于活动状态的长方形就此结束了。接着,client 实例会调用 server 实例的 print 方法。不过这次不同的是在 print 方法中,server 会调用 device 实例的 write 方法。

这样,我们就将多个对象之间的行为用图示的方法展现出来了。时序图的阅读顺序是沿着生命线从上到下阅读。当遇到箭头时,我们可以顺着箭头所指的方向查看对象之间的协作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值