前言

在备考软件设计师中级考试的过程中,我遇到了些许挑战,也收获了宝贵的经验。为了帮助其他同样正在为这门考试(证书)奋斗的朋友们,我决定将我的笔记整理出来,与大家分享。这些笔记不仅包含了书本上的知识,还加入了我对重点和难点的个人理解以及考试技巧,力求帮助大家更加高效地复习。我希望这份笔记能够成为你备考路上的一份支持,也祝愿你在考试中取得理想的成绩👍👍👍

如果有写的不好或者需要改进的地方,恳请在评论区指正!🤓🤓🤓

  • 需要官方资料教材可以在评论区留言或者私信,看见了就发~更新文章才会在线,感谢理解!b( ̄▽ ̄)d

第7章 面向对象技术 (上)

7.1 面向对象基础(3-4分)

7.1.1 面向对象的基本概念

  1. 对象
    在面向对象的系统中,对象是基本的运行时的实体,它既包括数据(属性),也包括作用于数据的操作(行为)。所以,一个对象把属性和行为封裝为一个整体。封装是一种信息隐蔽技术,它的目的是使对象的使用者和生产者分离,使对象的定义和实现分开。从程序设计者来看,对象是一个程序模块:从用户来看,对象为他们提供了所希望的行为。在对象内的操作通常称为方法。一个对象通常可由对象名、属性(状态)和方法3个部分组成。

  2. 消息
    对象之间进行通信的一种构造叫作消息。当一个消息发送给某个对象时,包含要求接收对象去执行某些活动的信息。接收到信息的对象经过解释,然后子以响应。这种通信机制称为消息传递。发送消息的对象不需要知道接收消息的对象如何对请求予以响应。


  3. 类可以分为三种:实体类、接口类(边界类)和控制类。实体类的对象表示现实世界中真实的实体,如人、物等。接口类(边界类)的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏、窗口、Web 窗体、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法。系统接口沙及到把数据发送到其他系统,或者从其他系统接收数据。控制类的对象用来控制活动流,充当协调者。

    例题:

    1. 在面向对象分析与设计中,(38)是应用领域中的核心类,一般用于保存系统中的信息以及提供针对这些信息的相关处理行为:(39)是系统内对象和系统外参与者的联系媒介;(40)主要是协调上述两种类对象之间的交互。(2009 年上半年)
      (38)A. 控制类 B. 边界类 C.实体类 D.软件类
      (39)A. 控制类 B. 边界类 C. 实体类 D. 软件类
      (40) A. 控制类 B. 边界类 C.实体类 D. 软件类
      答案:C B A
    2. 在某销售系统中,容户采用扫描二维码进行支付。若采用面向对象方法开发该销售系统,则客户类属于(39)类,二维码类属于(40)类。(2018 年下半年)
      (39) A. 接口 B.实体 C.控制 D.状态
      (40) A. 接口 B.实体 C.控制 D.状态
      答案:B;A
    3. 在面向对象的系统中,对象是运行时实体,其组成部分不包括(37):一个类定义了一组大体相似的对象,这些对象共享(38)。(2015 年下半年)
      (37) A. 消息 B. 行为(操作) C.对象名 D.状态
      (38) A. 属性和状态 B. 对象名和状态 C. 行为和多重度 D. 属性和行为
      答案:A;D
  4. 方法重载

    在Java中,方法重载是指在同一个类中定义多个同名但参数列表不同的方法。方法的参数列表包括参数的个数、类型或顺序。通过方法重载,可以根据不同的参数来调用相应的方法。

    方法重载的特点包括:

    1. 方法名必须相同,但参数列表必须不同。
    2. 方法的返回类型可以相同,也可以不同。
    3. 方法的修饰符可以相同,也可以不同。
    4. 方法的异常类型可以相同,也可以不同。
  5. 封装

    在Java中,封装是面向对象编程的一个重要概念,它将数据和对数据的操作封装在一个类中,通过访问修饰符控制对数据的访问权限。封装的目的是保护数据的完整性,隐藏实现细节,提供公共接口供其他对象使用。

    封装通过以下方式实现:

    1. 访问修饰符:Java提供了访问修饰符,如publicprivateprotected和默认(无修饰符)。这些修饰符用于控制类、属性和方法的访问级别。
      • public:任何类都可以访问。
      • private:只能在声明的类内部访问。
      • protected:只能在相同包内或子类中访问。
      • 默认(无修饰符):只能在相同包内访问。
    2. GetterSetter方法:通过定义公共的Getter和Setter方法来访问和修改私有属性。Getter方法用于获取属性的值,Setter方法用于设置属性的值。这样可以控制对属性的读取和修改,确保数据的一致性和安全性。

    封装提供了许多优点,包括:

    1. 数据隐藏:封装隐藏了类的实现细节,只暴露必要的接口,防止直接访问和修改对象的内部数据。
    2. 数据安全性:通过访问修饰符和GetterSetter方法的控制,可以防止未经许可的访问和修改数据,提高了数据的安全性。
    3. 代码灵活性:封装使得类的实现和内部结构可以灵活修改,而不影响其他类的使用。类的内部实现可以进行优化或改进,而不需要影响外部调用方的代码。

    总之,封装是面向对象编程中重要的概念,通过访问修饰符和Getter、Setter方法来控制对类的属性和方法的访问,提高了代码的可维护性、安全性和灵活性。

    习题

    1. 一个类是(38〉。在定义类时,将属性声明为 private 的目的是(39)。(2011年下半年)
      (38) A. 一组对象的封装 B. 表示一组对象的层次关系 C.一组对象的实例 D.一组对象的抽象定义
      (39) A. 实现数据隐藏,以免意外更改 B.操作符重载 C.实现属性值不可更改 D. 实现属性值对类的所有对象共享
      答案:D;A
    2. 在面向对象软件开发中,封装是一种(42)技术,其目的是使对象的使用者和生产者分离。(2011 年下半年)
      (42) A. 接口管理 B. 信息隐藏 C.多态 D.聚合
      答案:B
    3. 面向对象程序设计语言 C++、JAVA中,关键字(37)可以用于区分同名的对象属性和局部变量名。(2020年下半年)
      (37) A. private B. protected C. public D. this
      答案:D
  6. 继承
    继承是父类和子类之间共享数据和方法的机制。这是类之间的一种关系,在定义和实现一个类的时候,可以在一个已经存在的类的基础上进行,把这个己经存在的类所定义的内容作为自己的内容,并加入若干新的内容。图7-1表示了父类A 和它的子类B之间的继承关系。

    图7-1 类的继承关系

    一个父类可以有多个子类,这些子类都是父类的特例,父类描述了这些子类的公共属性和方法。一个子类可以继承它的父类(或祖先类)中的属性和方法,这些属性和操作在子类中不必定义,子类中还可以定义自己的属性和方法。
    图7-1中的B只从一个父类A 得到继承,叫作“单重继承”。如果一个子类有两个或更多个交类,则称为“多重继承”。

    习题:

    1. 以下关于面向对象继承的叙述中,错误的是(37)。(2010 年上半年)
      A.继承是父类和子类之间共享数据和方法的机制
      B.继承定义了一种类与类之间的关系
      C.继承关系中的子类将拥有父类的全部属性和方法
      D.继承仅仅允许单重继承,即不允许一个子类有多个父类

      解析:面向对象技术中,继承是父类和子类之间共享数据和方法的机制。这是类之间的一种关系,在定义和实现一个类的时候,可以在一个己经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。可以存在多重继承的概念,但不同的程序设计语言可以有自己的规定。
      参考答案(37) D

    2. 在面向对象技术中,41)定义了超类和子类之间的关系,子类中以更具体的方式实现从父类继承来的方法称为(42),不同类的对象通过(43)相互通信。(2013年下半年)
      (41) A. 覆盖 B.继承 C.消息 D.多态
      (42) A. 覆盖 B. 继承 C. 消息 D. 多态
      (43) A. 覆盖 B.继承 C.消息 D.多态
      答案:B;A;C
      “超类”的别名是“父类”“基类”,“子类”的别名是“派生类”

    3. 在面向对象方法中,两个及以上的类作为一个类的超类时,称为(37),使用它可能造成子类中存在_(38)的成员。(2017 年上半年)
      A. 多重继承 B. 多态 C.封装 D. 层次继承
      A. 动态 B. 私有 C.公共 D. 二义性
      答案:A;D

  7. 多态
    在收到消息时,对象要子以响应。不同的对象收到同一消息可以产生完全不同的结果,这一现象称为多态(Polymorphism)。在使用多态的时候,用户可以发送一个通用的消息,而实现的细节则由接收对象自行决定。这样,同一消息就可以调用不同的方法。
    多态的实现受到继承的支持,利用类的继承的层次关系,把具有通用功能的消息存放在高层次,而不同的实现这一功能的行为放在较低层次,在这些低层次上生成的对象能够给通用消息以不同的响应。
    多态有不同的形式,Cardelli 和 Wegner 把它分为4类,如下所示。其中,参数多态和包含多态称为通用的多态,过载多态和强制多态称为特定的多态。
    文7-1 多态

    参数多态是应用比较广泛的多态,被称为最纯的多态包含多态在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另一个类型的子类型。过载(Overloading)多态是同一个名字在不同的上下文中所代表的含义不同。

    • 多态指的是某类(客户类)无需知道所调用方法的特定子类的实现。
  8. 动态绑定
    绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行。
    动态绑定是和类的继承以及多态相联系的。在继承关系中,子类是父类的一个特例,所以父类对象可以出现的地方,子类对象也可以出现。因此在运行过程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。

7.1.2 面向对象分析(熟记)

同其他分析方法一样,面向对象分析 (Object-Oriented Analysis, 00A) 的目的是为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。面向对象分析方法与功能/数据分析法之间的差别是前期的表述含义不同。功能/数据分析法分开考虑系统的功能要求和数据及其结构,面向对象分析方法是将数据和功能结合在一起作为一个综合对象来考虑。面向对象分析技术可以将系统的行为和信息间的关系表示为迭代构造特征。

面向对象分析包含5个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。

  1. 认定对象
    在应用领域中,按自然存在的实体确立对象。在定义域中,首先将自然存在的“名词”作为一个对象,这通常是研究问题、定义域实体的良好开始。通过实体间的关系寻找对象常常没有问题,困难在于寻找(选择)系统关心的实质性对象,实质性对象是系统稳定性的基础。例如在银行应用系统中,实质性对象应包含客户账务、清算等,而门卫值班表不是实质性对象,甚至可不包含在该系统中。
  2. 组织对象
    分析对象间的关系,将相关对象抽象成类,其目的是为了简化关联对象,利用类的继承性建立具有继承性层次的类结构。抽象类时可从对象间的操作或一个对象是另一个对象的一部分来考虑,如房子是由门和窗构成的。由对象抽象类,通过相关类的继承构造类层次,所以说系统的行为和信息间的分析过程是一种迭代表征过程。
  3. 对象间的相互作用
    描述出各对象在应用系统中的关系,如一个对象是另一个对象的一部分,一个对象与其他对象间的通信关系等。这样可以完整地描述每个对象的环境,由一个对象解释另一个对象,以及一个对象如何生成另一个对象,最后得到对象的界面描述。
  4. 基于对象的操作
    当考虑对象的界面时,自然要考虑对象的操作。其操作有从对象直接标识的简单操作,如创建、增加和删除等;也有更复杂的操作,如将几个对象的信息连接起来。一般而言,避免对象太复杂比较好,当连接的对象太复杂时,可将其标识为新对象。当确定了对象的操作后,再定义对象的内部,对象内部定义包括其内部数据信息、信息存储方法、继承关系以及可能生成的实例数等属性。
    分析阶段最重要的是理解问题城的概念,其结果将影响整个工作。经验表明,从应用定义域概念标识对象是非常合理的,完成上述工作后写出规范文档,文档确定每个对象的范围。
    早期面向对象的目标之一是简化模型与问题城之间的语义差距。事实上,面向对象分析的基础是软件系统结构,这依赖于人类看待现实世界的方法。当人们理解求解问题的环境时,常采用对象、分类法和层次性这类术语。面向对象分析与功能/数据分析方法相比,面向对象的结果比较容易理解和管理。面向对象分析方法的另一个优点是便于修改,早期阶段的修改容易提高软件的可靠性。
  • 面向对象分析侧重于理解问题、系统责任
  • 面向对象分析描述软件要做什么
  • 面向对象设计侧重于理解解决方案

7.1.3 面向对象设计

面向对象设计 (Objiect-Oriented Design, OOD)是将 OOA 所创建的分析模型转化为设计模型,其目标是定义系统构造蓝图。通常的情况是,由概念模型生成的分析模型被装入到相应的执行环境中时,需要考虑实现问题加以调整和增补,如根据所用编程语言是否支持多继承或继承,而调整类结构。OOA与OOD之间不存在鸿沟,采用一致的概念和一致的表示法,OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计准则。

  1. 面向对象设计的活动(熟记)
    OOD 在复用 OOA 模型的基础上,包含与 OOA 对应如下五个活动。
    (1)识别类及对象。
    (2)定义属性。
    (3)定义服务。
    (4)识别关系。
    (5)识别包。
  2. 面向对象设计的原则【必背知识点】
    (1)单一责任原则 (Sinele Responstbility Prineiple, SRP)。就一个类而言,应该仅有一个引起它变化的原因。即,当街要修改菜个类的时候原因有且只有一个,让一个类只做一种类型责任。
    (2)开放-封闭原则(Open & Close Principle, OCP)。软件实体(类、模块、函数等)应该是可以扩展的,即开放的:但是不可修改的,即封闭的。对扩展开放,修改关闭
    (3)里氏替换原则(Liskoy Substitution Principle, LSP)。子类型必须能够替换掉他们的基类型。即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有是一个(is-a)关系。(基类出现的地方,子类一定可以出现)
    (4)依赖倒置原则(Dependence Inversion Prineiple, DIP)。抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。(依赖于抽象,而不依赖于细节(实现))
    (5)接口分离原则(Interface Segregation Prineiple,IsP)。不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。
    上述(1)~(5)是面向对象方法中的五大原则。除了这五大原则之外,Robert C. Martin提出的面向对象设计原则还包括以下几个。
    (6)重用发布等价原则 (Release Reuse Eguivalency Principle, REP)。重用的粒度就是发布的粒度。
    (7)共同封闭原则(Common Closure Principle, CCP)。包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
    (8)共同重用原则(Common Reuse Principle, CRP)。一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类
    (9) 无环依赖原则 (Acyclie Dependencies Principle, ADP)。在包的依赖关系图中不允许存在环,即包之间的结构必须是一个直接的五环图形。
    (10) 稳定依赖原则(Stable Dependencies Principle, SDP)。朝着稳定的方向进行依赖。
    (11) 稳定抽象原则(Stable Abstractions Principle, SAP)。包的抽象程度应该和其稳定程度一致。

7.1.4 面向对象程序设计

  1. 继承和类层次结构
  2. 对象、消息传递和方法
  3. 对象自身引用
  4. 重置
  5. 类属类
  6. 无实例的类

7.1.5 面向对象测试

(熟记)
(1)算法层。测试类中定义的每个方法,基本上相当于传统软件测试中的单元测试。
(2)类层。测试封装在同一个类中的所有方法与属性之间的相互作用。在面向对象软件中类是基本模块,因此可以认为这是面向对象测试中所特有的模块测试。
(3)模板层。测试一组协同工作的类之间的相互作用,大体上相当于传统软件测试中的集成测试,但是也有面向对象软件的特点(例如,对象之间通过发送消息相互作用)。
(4)系统层。把各个子系统组裝成完整的面向对象软件系统,在组装过程中同时进行测试。软件工程中传统的测试用例设计技术,如逻辑覆盖、等价类划分和边界值分析等方法,仍然可以作为测试类中每个方法的主要技术。面向对象测试的主要目标也是用尽可能低的测试成本和尽可能少的测试用例,发现尽可能多的错误。但是,面向对象程序中特有的封裝、继承和多态等机制,也给面向对象测试带来一些新特点,增加了测试和调试的难度。

7.2 UML(3~4分)

7.2.1 事务

UML中有4种事物:结构事物、行为事物、分组事物和注释事物。
(1) 结构事物(Struetural Thing)。结构事物是 UML模型中的名词。它们通常是模型的静态部分,描述概念或物理元素。结构事物包括类(Class)、接口(Interface)、协作 (Collaboration)、用例(Use Case)、主动类 (Active Class)、构件(Component)、制品(Artifact)和结点(Node)。各种结构事物的图形化表示如图7-2所示。
图7-2 结构事务的图形表示

(2) 行为事物 (Behavior thing)。行为事物是 UML 模型的动态部分。它们是模型中的动词,描述了跨越时间和空间的行为。行为事物包括交互(Interaction)、状态机(State Machine)和活动(Activity)。各种行为事物的图形化表示如图7-3 所示。
图7-3 行为事务的图形表示

(3) 分组事物(Grouping Thing)。分组事物是 UIML模型的组织部分,是一些由模型分解成的“盒子”。在所有的分组事物中,最主要的分组事物是包(Package)。包是把元素组织成组的机制,这种机制具有多种用途。结构事物、行为事物甚至其他分组事物都可以放进包内。包与构件(仅在运行时存在)不同,它纯粹是概念上的(即它仅在开发时存在)。包的图形化表示如图 7-4所示。

(4) 注释事物(Annotational Thing)。注释事物是 UML 模型的解释部分。这些注释事物用来描述、说明和标注模型的任何元素。注解(Note)是一种主要的注释事物。注解是一个依附于一个元素或者一组元素之上,对它进行约束或解释的简单符号。注解的图形化表示如图 7-5所示。

图7-4 包

7.2.2 关系

UML中有4 种关系:依赖、关联、泛化和实现。
(1)依赖 (Dependeney)。依赖是两个事物间的语义关系,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。在图形上,把一个依赖画成一条可能有方向的虚线,如图7-6所示。
(2)关联(Association)。关联是一种结构关系,它描述了一组链,链是对象之间的连接。聚集 (Aggregation)是一种特殊类型的关联,它描述了整体和部分间的结构关系。关联和聚集的图形化表示如图 7-7 和图 7-8 所示。
聚合:部分和整体的生命周期不一致,整体消失了,部分仍然存在,部分可以脱离整体存在。
组合:部分和整体的生命周期一致,整体消失了,部分也消失了;部分不可以脱离整体而存在。
图7-6 依赖

在关联上可以标注重复度(Multiplicity)和角色 (Role)。
(3)泛化(Generalization)。泛化是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种方法,子元素共享了父元素的结构和行为。在图形上,把一个泛化关系画成一条带有空心箭头的实线,它指向父元素,如图 7-9 所示。
(4)实现(Realization)。实现是类元之间的语义关系,其中一个类元指定了由另一个类元保证执行的契约。在两种情况下会使用实现关系:一种是在接口和实现它们的类或构件之间:另一种是在用例和实现它们的协作之间。在2024年4月7日图形上,把一个实现关系画成一条带有空心箭头的虚线,如图7-10 所示。

图7-9 泛化

这4种关系是UML 模型中可以包含的基本关系事物。它们也有变体,例如,依赖的变体有精化、跟踪、包含和延伸。

7.2.2.1 多重度

进行面向对象设计时,类图中可以展现类之间的关联关系,还可以在类图中图示关联中的数量关系,即多重度。表示数量关系时,用多重度说明数量或数量范围,表示有多少个实例(对象)能被连接起来,即一个类的实例能够与另一个类的多少个实例相关联。

把一组对象的共同特征加以抽象并存储在一个类中,不同个数的类之间可能有不同的关系。关联关系是类之间的一种结构关系,描述了对象之间连接的一组链。一辆汽车中有多个座位,一个座位隶属于一辆汽车。一个主人可以养多只宠物,一只宠物有一个(或同一家庭的多个主人)。医生可以为多个病人看病,病人也可以去找多位医生看病,而且,同一个病人可以在不同时间多次找同一个医生看病,这一过程只通过关联关系难以建模出两者之间的关系,需要在关联关系上创建新的类。一个部门有多名员工,一个员工隶属于一个部门。

7.2.3 UML中的的图

图(Diagram)是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。为了对系统进行可视化,可以从不同的角度面图,这样图是对系统的投影。UML 2.0 提供了 13 种图,分别是类图、对象图、用例图、序列图、通信图、状态图、活动图、构件图、组合结构图、部署图、包图、交互概览图和计时图。序列图、通信图、交互概览图和计时图均被称为交互图。

  1. 类图
    类图(Class Diagram)展现了一组对象、接口、协作和它们之间的关系。在面向对象系统的建模中所建立的最常见的图就是类图。类图给出系统的静态设计视图。包含主动类的类图给出了系统的静态进程视图。
    类图中通常包括下述内容(如图 7-11 所示)。
    (1)类。
    (2)接口。
    (3)协作。
    (4)依赖、泛化和关联关系。

图7-11 UML类图

类图中也可以包含注解和约束。类图还可以含有包或子系统,二者都用于把模型元茶聚集成更大的组块。

类图用于对系统的静态设计视图建模。这种视图主要支持系统的功能需求,即系统要提供给最终用户的服务。当对系统的静态设计视图建模时,通常以下述3种方式之一使用类图。

(1)对系统的词汇建模。
(2)对简单的协作建模。
(3)对逻辑数据库模式建模。

  1. 对象图

    对象图(Objeet Diagram) 展现了某一时刻一组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照。对象图一般包括对象和链,如图 7-12所示。
    图7-12 UML对象图

    对象名的三种表示法如下:

    • 对象名:类名stu:Student标准表示法
    • :Student 匿名表示法
    • stu省略类名的表示法
  2. 用例图
    用例图(Use Case Diagram)展现了一组用例、参与者(Actor)以及它们之间的关系。
    用例图通常包括以下内容(如图7-13 所示)。
    (1)用例。
    (2)参与者。
    (3)用例之间的扩展关系(<<extend>>)和包含关系(<<sinclude>>),参与者和用例之间的关联关系,用例与用例以及参与者与参与者之间的泛化关系。
    图7-13 UML用例图

    • 关联是参与者和用例之间的关系
    • 包含是用例和用例之间的关系
    • 扩展是用例和用例之间的关系
      • 一个用例执行的时候,可能会发生一些特殊的情况或可选的情况
    • 泛化是参与者和参与者之间的关系,也是用例和用例之间的关系

    当对系统的静态用例视图建模时,可以用下列两种方式来使用用例图。
    (1) 对系统的语境建模。对一个系统的语境进行建模,包括围绕整个系统画一条线,并声明有哪些参与者位于系统之外并与系统进行交互。在这里,用例图说明了参与者以及它们所扮演的角色的含义。
    (2) 对系统的需求建模。对一个系统的需求进行建模,包括说明这个系统应该做什么(从系统外部的一个视点出发),而不考虑系统应该怎样做。在这里,用例图说明了系统想要的行为。通过这种方式,用例图使我们能够把整个系统看作一个黑盒子,采用矩形框表示系统边界;可以观察到系统外部有什么,系统怎样与哪些外部事物相互作用,但却看不到系统内部是如何工作的。

  3. 交互图
    交互图用于对系统的动态方面进行建模。一张交互图表现的是一个交互,由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。交互图表现为序列图、通信图、交互概览图和计时图,每种针对不同的目的,能适用于不同的情况。序列图强调消息时间顺序的交互图;通信图强调接收和发送消息的对象的结构组织的交互图:交互概览图强调控制流的交互图。

    1. 序列图(顺序图)
      序列图(Sequence Diagram) 是场景(Scenario)的图形化表示,描述了以时间顺序组织的对象之间的交互活动。如图7-14所示
      图7-14 UML序列图

      序列图有两个不同于通信图的特征。
      (1)序列图有对象生命线。对象生命线是一条垂直的虚线,表示一个对象在一段时间内存在。
      (2)序列图有控制焦点。控制焦点是一个瘦高的矩形,表示一个对象执行一个动作所经历的时间段,既可以是直接执行,也可以是通过下级过程执行。矩形的顶部表示动作的开始,底部表示动作的结束(可以由一个返回消息来标记)。

    2. 通信图
      通信图(Communication Diagram) 强调收发消息的对象的结构组织,在早期的版本中也被称作协作图。通信图强调参加交互的对象的组织。产生一张通信图,如图 7-15所示,首先要将参加交互的对象作为图的顶点,然后把连接这些对象的链表示为图的弧,最后用对象发送和接收的消息来修饰这些链。这就提供了在协作对象的结构组织的语境中观察控制流的一个清晰的可视化轨迹。
      图7-15 UML通信图

      通信图有两个不同于序列图的特性。
      通信图展现了对象之间的消息流及其顺序

    3. 通信图有路径。

    4. 通信图有顺序号。为表示一个消息的时间顺序,可以给消息加一个数字前缀(从1号消息开始),在控制流中,每个新消息的顺序号单调增加(如2、3 等)。为了显示联套,可使用带小数点的号码(1 表示第一个消息:1.1 表示嵌套在消息1中的第一个消息,1.2 表示嵌套在消息1中的第二个消息,等等)。嵌套可为任意深度。还要注意的是,沿同一个链可以显示许多消息(可能发自不同的方向),并且每个消息都有唯一的一个顺序号。序列图和通信图是同构的,它们之间可以相互转换。
      序列图和通信图是同构的,它们之间可以相互转换。

  4. 状态图
    状态是状态机图的重要组成部分,它描述了一个对象稳定处于的某一个持续过程或所处状况,与动态行为的执行所产生的结果。当对象满足某一状态的条件时,该状态被称为激活的。
    在 UML,中,状态分为简单状态与复合状态。简单状态就是没有嵌套的状态,一般表示为具有一个或两个分档的圆角矩形。初态(initial state)和终态(final state)是两个特殊的状态分别表示状态机的人口状态和出口状态。对于一个不含嵌套结构的状态机,只能有一个初态,可以有一个或多个终态甚至没有终态。初态表示为一个小的实心圆,终态表示为初态的符号外部再围上一个圆。图10-2显示了简单状态的各种表示法。
    在这里插入图片描述

    三种标准事件:entry,exit,do
    entry:入口动作,进入状态,立即执行
    exit:出口动作,退出状态,立即执行
    do:内容不活动,占有优先时间,并可以中断的工作

在这里插入图片描述
在这里插入图片描述

  1. 调用事件(call event)
  2. 改变事件(change event)
  3. 信号事件(signal event)
  4. 时间事件(time event)

【熟记】

转换包括两个状态(源状态,目标状态),事件,监护条件,动作
时间触发转换(迁移
活动(动作)可以在状态内执行,也可以在状态转换(迁移)时执行

在这里插入图片描述

状态图(State Diagram) 展现了一个状态机,它由状态、转换、事件和活动组成。状态图关注系统的动态视图,对于接口、类和协作的行为建模尤为重要,强调对象行为的事件顺序
图7-18 UML状态图

可以用状态图对系统的动态方面建模。这些动态方面可以包括出现在系统体系结构的任何视图中的任何一种对象的按事件排序的行为,这些对象包括类(各主动类)、接口、构件和结点。
当对系统、类或用例的动态方面建模时,通常是对反应型对象建模。
一个反应型或事件驱动的对象是这样一个对象,其行为通常是由对来自语境外部的事件做出反应来刻画的。反应型对象在接收到一个事件之前通常处于空闲状态。当它接收到一个事件时,它的反应常常依赖于以前的事件。在这个对象对事件做出反应后,它就又变成闲状态,等待下一个事件。对于这种对象,将着眼于对象的稳定状态、能够触发从状态到状态的转换的事件,以及当每个状态改变时所发生的动作。

  • 用于描述一个对象在多个用例中的行为
  • 用于某些具有多个状态的对象而不是系统中大多数或者全部对象
  • 可以用于用户界面或控制对象
  1. 活动图
    活动图 (Activity Diagram)是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程,如图7-19 所示。活动图专注于系统的动态视图,它对于系统的功能建模特别重要,并强调对象间的控制流程。
    图7-19 UML活动图
    活动图一般包括活动状态和动作状态、转换和对象。
    活动图可以表示分支、合并、分岔和汇合。
    当对一个系统的动态方面建模时,通常有两种使用活动图的方式。
    (1)对工作流建模。此时所关注的是与系统进行协作的参与者所观察到的活动。工作流常常位于软件系统的边缘,用于可视化、详述、构造和文档化开发系统所涉及的业务过程。在活动图的这种用法中,对对象流的建模是特别重要的,常采用泳道将活动图中的活动状态分组。
    (2)对操作建模。此时是把活动图作为流程图使用,对一个计算的细节部分建模。在活动图的这种用法中,对分支、合并、分岔和汇合状态的建模是特别重要的。用于这种方式的活动图语境包括该操作的参数和它的局部对象。

  2. 构件图(组件图)
    构件图(Component Diagram) 展现了一组构件之间的组织和依赖。构件图专注于系统的静态实现视图,如图7-20 所示。它与类图相关,通常把构件映射为一个或多个类、接口或协作。
    图7-20 UML构件图
    在这里插入图片描述
    在UML 1.x中,组件的接口与类图接口的表示方法一致,都是用一个小圆圈表示。提供该接口的组件与接口通过简化的实现关系(一条实线段)相连接,而需要该接口的组件则使用依赖关系(一条虚线箭头)与组件相连接。图12-4显示了这种表示法。
    在这里插入图片描述
    在UML2规范中,接口元素还提供了另一种表示法。在这种新的表示法中,接口的提供和需求两部分是分别表示的。提供接口表示为用直线连接组件的一个小圆圈,需求接口表示为用线连接组件的一个半圆,通过提供接口与需求接口的连接来表示两个组件与接口之间的关系,如图12-5所示,这种表示法也被形象地称为“球窝表示法”。实际上,两种表示法所表示的语义是完全相等的。

  3. 组合构件图

  4. 部署图
    部署图(Deployment Diagram)是用来对面向对象系统的物理方面建模的方法,展现了运行时处理结点以及其中构件(制品)的配置。部署图对系统的静态部署视图进行建模,它与构件图相关。通常,一个结点是一个在运行时存在并代表一项计算资源的物理元素,至少拥有一些内容,常常具有处理能力,包含一个或多个构件。部署图如图 723 所示,其中,<<attifact>>表示制品。
    部署图展现了系统的软件和硬件之间的关系,在实施阶段使用

图7-23 UML部署图

静态建模:类图、对象图、用例图
动态建模:序列图(顺序图,时序图)、通信图(协作图)、状态图、活动图
物理建模:构件图(组件图)、部署图
交互图:序列图(顺序图,时序图)、通信图(协作图)


结语

这份笔记由我在备考软件设计师中级考试的过程中编写,包含了我对知识点的理解与总结。如果您觉得这份笔记对您有帮助,并希望分享给更多的人,我十分乐意。但请在转载时务必注明出处,以尊重作者的劳动成果,感谢您的理解与支持

在此特别强调,本人编写笔记的所需部分资源均源于网络公开资源,旨在为大家提供一个学习和交流的内容,未经原作者授权,如若不慎侵犯您的合法权益,请您立即通过有效联系方式通知我,并附上相关证明材料。一旦核实无误,我将在第一时间删除涉事资源,全力保障您的合法权利不受损害。


  • 每篇一句:“没有白费的努力,也没有碰巧的成功。只要认真对待生活,终有一天,你的每一份努力,都将绚烂成花。”
  • 如果觉得对您有用,请点个赞或者收藏鼓励我持续更新吧!【努力加更中……】
  • 恭喜您,已挑战成功第七关上,请前往第七关下进行挑战吧【点击即可跳转第七章下
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐