第二章:如何阅读类图

现在你知道什么是设计模式了吧! 在这一章中,你将学习一个基本概念来帮助你理解设计模式:类图。

类图就像工程蓝图;它们通过图片、符号和注释的媒介来提供系统的信息。

你可能听说过统一建模语言(UML),它是一种用于创建类图、建筑图和其他系统图示的标准语言。对UML的完整讨论超出了本书的范围,但你在日常的iOS开发中不需要了解很多UML。相反,你将在本章中学习UML的一个子集,它对创建类图和描述设计模式很有用。

类图里有什么?

类图包括类、协议、属性、方法和关系。

一个方框表示一个类。下面是一个非常简单的狗类的类图。

为了表示一个类继承于另一个类,使用一个开放的箭头。

但不要把它读成 "继承于",而要读成 "是"。例如,为了表明SheepDog继承于Dog,你可以画出下面的图。

你可以把它从下到上读成 "SheepDog是一只狗"。

用一个普通的箭头来表示一个属性,这在UML术语中被称为 "关联"。

类图可以从下往上写,也可以从左往右写,还可以用其他任何你想用的方向。无论哪种方向,箭头的方向都决定了其含义。继承箭头总是指向父类,而属性箭头总是指向属性类。

你应该把属性箭头理解为 "有一个"。例如,如果一个农民有一只狗,你会这样画。

你可以通过在箭头旁边指定一个范围来表示一对多的关系。例如,你可以这样表示一个农夫有一个或多个狗。

在类图中,你应该始终使用类名的单数形式,即使你在传达一对多的关系。在这种情况下,你应该写Dog,而不是Dogs。

你可以在一个类图中使用任意多的箭头和方框。例如,下面是你如何表示一个农夫有一只属于狗的SheepDog。

你也可以用一个框来表示一个协议。然而,为了将它与一个类区分开来,你需要在它的名字前写上<>。

下面是你如何表示一个叫做PetOwning的协议。

使用带虚线的开放式箭头来表示一个类实现了一个协议。

你可以把它理解为 "实施 "或 "符合"。例如,你可以这样表示Farmer符合PetOwning的规定。

用一个普通的箭头加上虚线来表示 "使用",这在UML术语中被称为 "依赖"。

UML故意对什么是依赖关系含糊其辞。因此,当你使用一个依赖性箭头时,你通常应该注解它的目的。例如,你可以用一个依赖性箭头来表示以下东西。

你也可以在类图中表示出属性和方法。例如,你可以这样表示PetOwning有一个name属性和一个petNeedsFood(_:)方法。

如果一个箭头的含义很明显,你可以省略任何解释文字。一般来说,你可以省略对继承、属性和实现箭头的解释。然而,你通常应该为 "使用 "箭头保留文字,因为它们的含义并不总是那么明显。

下面是一个拥有SheepDog的农夫的完整类图,SheepDog是一个委托给PetOwning对象的狗。

挑战

现在你已经掌握了基础知识,是时候测试一下你的知识了!在一张纸上画出以下挑战的类图。

在一张纸上,为以下每个挑战画出类图。准备好后,在下一页查看答案。

  1. 狗和猫继承于动物,动物定义了一个吃的方法。

  2. 车辆协议有一个马达和一个或多个车轮对象。

  3. 教授是一名教师,符合人的协议。

对于这些挑战,有许多正确的解决方案。例如,你不需要从上到下画图。相反,你可以从左到右或其他方向画。只要你的类图清楚地传达了预期的意思,它就是正确的!

解决方案1。你需要三个盒子:猫、狗和动物各一个。你需要一个从猫到动物的开放箭头,以及另一个从狗到动物的开放箭头。你还应该在Animal上注明eat()。

解决方案2。你应该有三个盒子:一个用于<<协议>>车辆、马达和车轮。你应该有一个从Vehicle到Motor的普通箭头,还有一个从Vehicle到Wheel的普通箭头。你还应该有1 ... 指向车轮的箭头旁边应该有*。

解决方案3。这个问题的措辞是故意含糊的。我们的意思可能是,要么教师符合人,要么教授符合人。因此,教授将直接或间接地通过教师与人相一致。

如果教师符合人,而教授继承于教师,那么类图看起来是这样的。

如果教授符合人称,但教师不符合,那么班级图看起来是这样的。

关键点

你在本章中学习了类图的基本知识。这就是你理解本书其他部分的图所需要的全部内容。如果需要的话,你可以随时参考本章的内容


上一章 目录 下一章