UML类图和面向对象设计原则

140 阅读9分钟

常用的面向对象设计原则有 7 个,分别是单一职责原则、开闭原则、里氏替换原则、依赖倒转原则、接口隔离原则、合成复用原则和迪米特原则


UML

UML 特性

UML,Unified Modeling Language,统一建模语言

  • UML 融合多种优秀的面向对象建模方法以及多种得到任何的软件工程方法,消除了因方法邻里且相互独立而带来的种种不便,集百家之所长,所以称为统一(Unified)
  • UML 是一种通用的可视化建模(Modeling)语言,它通过一些标准的图形符号和文字来对系统进行建模,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档
  • UML 是一种语言(Language),它有属于自己的标准表达规则,它不是编程语言,而是一种分析设计语言

UML 结构

UML 是一种由图形符号表达的建模语言,其结构包括

  • 视图(View),从不同的角度来标识待建模系统。UML 视图包括用户视图、结构视图、行为视图、实现视图和环境视图

    • 用户视图:以用户的观点表示系统的目标,它是所有视图的核心,用于描述系统的需求
    • 结构视图:表示系统的静态行为,描述系统的静态元素,比如包、类和对象,以及它们之间的关系
    • 行为视图:表示系统的动态行为,描述系统的组成元素在系统运行时的交互关系
    • 实现视图:表示系统中逻辑元素的分布,描述系统中物理文件以及它们之间的关系
    • 环境视图:表示系统中物理元素的分布,描述系统中硬件设备以及它们之间的关系
  • 图(Diagram),描述 UML 视图内容的图形。共有 13 种图,分别是用例图、类图、对象图、包图、组合结构图、状态图、活动图、顺序图、通信图、定时图、交互概览图、组件图和部署图

    • 用例图对应用户视图
    • 类图、丢想吐、包图和组合结构图对应结构视图
    • 状态图、活动图、顺序图、通信图、定时图和交互概览图对应行为视图
    • 组件图对应实现视图
    • 部署图对应环境视图
  • 模型元素(Model Element),是指 UML 图中所使用的一些概念,它们对应于普通的面向对象概念,如类、对象、消息以及这些观念的关系,比如关联关系、依赖关系、泛化关系等

  • 通用机制(General Mechanism)。为模型元素提供额外的注释、信息和语义


类图

类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称

类图是用出现在系统中的不同类来描述系统的静态结构,主要用来描述不同的类以及它们之间的关系

classDiagram

class Employee{
- name: String
- age: int
- email: String
+ modifyInfo(): void
}

类图使用包含类名、属性和操作且带有分割线的长方形来表示,如 Employee 类,它包含属性 name、age 和 email,以及操作 modifyInfo()

  • 类名:每个类必须有一个名字,类名是一个字符串

  • 属性:类的特质,即成员变量。一个类可以有任意多属性,也可以没有属性

可见性 名称: 类型[ = 默认值]

可见性:表示该属性对于类外的元素是否可见,包括公有(public)、私有(private)和受保护(protected)三种,分别用符号 +-、和 #
名称:属性名,用字符串表示
类型:属性的数据类型,可以是基本数据类型,也可以是用户自定义类型
默认值:可选项,即属性的初始值

  • 操作:类的任意一个实例对象都可以使用的行为,是类的成员方法
可见性 名称([参数列表])[: 返回类型]

可见性:同属性可见性
名称:方法名,用字符串表示
参数列表:方法的参数,参数个数是任意的,多个参数用逗号隔开
返回类型:可选项,表示方法的返回值类型

类之间的关系

关联关系

关联关系,表示一类对象和另一类对象之间的关系

关联关系在 UML 类图中,用实线连接有关联关系的对象所对应的类。

image.png

关联关系的几种表现形式

  • 双向关联
    • 默认情况下,关系是双向的,用实线标识

image.png

  • 单向关联
    • 用带箭头的实线标识

image.png

  • 自关联
    • 还存在一些类的属性对象类型为该类本身,这种关系称为自关联

image.png

  • 多重关联
    • 又称重数性关联关系,表示两个关联对象在数量上的对应关系,对象之间的多重性在关联直线上用一个数字或者一个数字范围标识

image.png

image.png

上图标识一个 Form 类可以与零个或多个 Button 相关联,但一个 Button 只能与一个 Form 相关联

  • 聚合关系
    • 聚合关系标识整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但成员对象可以脱离整体对象独立存在。在 UML 中,聚合关系用带空心菱形的直线表示

image.png

  • 组合关系
    • 组合关系也表示整体和部分的关系。在组合关系中,整体对象可以控制成员对象的生命周期。一旦整体对象不存在,成员对象也将不存在,成员对象和整体对象之间存在同生共死的关系。在 UML 中,组合关系用带实心菱形的直线表示

image.png

依赖关系

依赖关系是一种使用关系,特定事物的改变有可能影响到使用该事物的其它事物

依赖关系在 UML 中用带箭头的虚线标识,由依赖的一方指向被依赖的一方

image.png

依赖干洗通常通过三种方式来实现

  • 将一个类的对象作为另一个类中方法的参数
  • 在一个类的方法中将另一个类的对象作为其局部变量
  • 在一个类的方法中调用另一个类的静态方法

泛化关系

泛化关系也就是继承关系,用于描述父类和子类的关系,父类又称基类或超累,子类又称派生类

泛化关系在 UML 中用带空心三角形的直线表示

image.png

接口与实现关系

接口,通常没有属性,而且所有操作都是抽象的,只有声明,没有实现

在 UML 中接口与类的表示方法相似,接口之间也有继承和依赖关系。接口和类之间还存在一种实现关系,即类实现了接口。在 UML 中,类与接口之间的实现关系用带空心三角的虚线标识

image.png

image.png

面向对象设计原则

image.png

  • 单一职责原则

单一职责原则:一个类只负责一个功能领域中的相应职责
单一职责原则是实现高内聚、低耦合的指导方针,对于一个类而言,应该只有一个引起它变化的原因

  • 开闭原则

开闭原则:一个软件实体应当对扩展开放,对修改关闭。即软件实体应该尽量在不修改原有代码的情况下进行扩展

  • 里氏替换原则

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立

  • 依赖倒转原则

依赖倒转原则:抽象不应该依赖于细节,细节应该依赖于抽象。要针对接口编程,而不是针对实现编程
在实现依赖倒转原则时,需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入其它对象中

依赖注入:当一个对象要与其它对象发生依赖关系时,通过抽象来注入所依赖的对象
依赖注入的方式有三种
构造注入:通过构建函数来传入具体类的对象
设值注入:通过 Setter 方法来传入具体类的对象
接口注入:通过实现在接口中声明的业务方法来传入具体类的对象

  • 接口隔离原则

接口隔离原则:使用多个转来的接口,而不是用单一的总接口。客户端不应该依赖那些它不需要的接口

当一个接口太大时,需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可

这里的接口有两种不同的含义:
一种是指一个类型所具有的方法特征的结合,仅仅是一种逻辑上的抽象
这种逻辑接口的划分将直接带来类型的划分,这个原则也可以称为「角色隔离原则」 一种是指某种语言具体的「接口」定义,有严格的定义和结构 这种接口仅提供客户端需要的行为,这种机制称为「定制服务」

  • 合成复用原则

合成复用原则:又称组合/聚合复用原则,尽量使用对象组合,而不是继承来达到复用的目的
即在一个新对象中通过关联关系来使用一些已有的对象,使之成为新对象的一部分
新对象通过委派调用已有对象的方法达到复用功能的目的。尽量使用组合/聚合关系,少用继承

  • 迪米特原则

迪米特原则:一个软件实体应当尽可能少的与其它实体发生相互作用