⼀、OOA、OOD、OOP介绍
OOA:⾯向对象分析,全称是 Object Oriented Analysis。
OOD:⾯向对象设计,全称是 Object Oriented Design。
OOP:⾯向对象编程,全称是 Object Oriented Programming。
OOA、OOD、OOP 三个连在⼀起就是⾯向对象分析、设计、编程(实现),正好是⾯向对象软件开发要经历的三个阶段。
⾯向对象编程中有两个⾮常重要、⾮常基础的概念,那就是类(class)和对象(object)。
理解⾯向对象编程的四⼤特性:封装、继承、多态、抽象。
讲到⾯向对象分析、设计、编程,我们就不得不提到另外⼀个概念,那就是统⼀建模语⾔UML(Unified Model Language)。很多讲解⾯向对象或设计模式的书籍,常⽤它来画图表达⾯向对象或设计模式的设计思路。
⼆、UML类图及类图的关系
统⼀建模语⾔简介
统⼀建模语⾔(Unified Modeling Language,UML)是⽤来设计软件蓝图的可视化建模语⾔,1997 年被国际对象管理组织(OMG)采纳为⾯向对象的建模语⾔的国际标准。它的特点是简单、统⼀、图形化、能表达软件设计中的动态与静态信息。
统⼀建模语⾔能为软件开发的所有阶段提供模型化和可视化⽀持。⽽且融⼊了软件⼯程领域的新思想、新⽅法和新技术,使软件设计⼈员沟通更简明,进⼀步缩短了设计时间,减少开发成本。它的应⽤领域很宽,不仅适合于⼀般系统的开发,⽽且适合于并⾏与分布式系统的建模。
UML 从⽬标系统的不同⻆度出发,定义了⽤例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。
本课程主要介绍软件设计模式中经常⽤到的类图,以及类之间的关系。
类、接⼝和类图
1. 类
类(Class)是指具有相同属性、⽅法和关系的对象的抽象,它封装了数据和⾏为,是⾯向对象程序设计(OOP)的基础,具有封装性、继承性和多态性等三⼤特性。
在 UML 中,类使⽤包含类名、属性和操作且带有分隔线的矩形来表示。
1. 类名(Name)是⼀个字符串,例如,Student。
2. 接⼝
2. 属性(Attribute)是指类的特性,即类的成员变量。
接⼝(Interface)是⼀种特殊的类,它具有类的结构但不可被实例化,只可以被⼦类实现。它包含抽象操作,但不包含属性。它描述了类或组件对外可⻅的动作。
3. 类图
类图(ClassDiagram)是⽤来显示系统中的类、接⼝、协作以及它们之间的静态结构和关系的⼀种静态模型。它主要⽤于描述软件系统的结构化设计,帮助⼈们简化对软件系统的理解,它是系统分析与设计阶段的重要产物,也是系统编码与测试的重要模型依据。
类图中的类可以通过某种编程语⾔直接实现。类图在软件系统开发的整个⽣命周期都是有效的,它是⾯向对象系统的建模中最常⻅的图。
类之间的关系
在软件系统中,类不是孤⽴存在的,类与类之间存在各种关系。
根据类与类之间的耦合度从弱到强排列,UML 中的类图有以下⼏种关系:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦合度相等,它们是最强的。
1. 依赖关系
依赖(Dependency)关系是⼀种使⽤关系,它是对象之间耦合度最弱的⼀种关联⽅式,是临时性的关联。
在代码中,某个类的⽅法通过【局部变量、⽅法的参数或者对静态⽅法】的调⽤来访问另⼀个类(被依赖类)中的某些⽅法来完成⼀些职责。
2. 关联关系
关联(Association)关系是对象之间的⼀种引⽤关系,⽤于表示⼀类对象与另⼀类对象之间的联系,如⽼师和学⽣、师傅和徒弟、丈夫和妻⼦等。
关联关系是类与类之间最常⽤的⼀种关系,分为⼀般关联关系、聚合关系和组合关系。我们先介绍⼀般关联。
关联可以是双向的,也可以是单向的。
3. 聚合关系(has a)
聚合(Aggregation)关系是关联关系的⼀种,是强关联关系,是整体和部分之间的关系,是 has-a 的关系。
聚合关系也是通过成员对象来实现的,其中成员对象是整体对象的⼀部分,但是成员对象可以脱离整体对象⽽ᇿ⽴存在。例如,学校与⽼师的关系,学校包含⽼师,但如果学校停办了,⽼师依然存在。
4. 组合关系
组合(Composition)关系也是关联关系的⼀种,也表示类之间的整体与部分的关系,但它是⼀种更强烈的聚合关系,是 contains-a 关系。
在组合关系中,整体对象可以控制部分对象的⽣命周期,⼀旦整体对象不存在,部分对象也将不存在,部分对象不能脱离整体对象⽽存在。例如,头和嘴的关系,没有了头,嘴也就不存在了。
类与类之间的关系
1. 依赖关系(局部变量、形参、静态⽅法的调⽤)
2. 关联关系(成员变量)
1. ⼀般关联关系
2. 聚合关系(has - a)
3. 组合关系(contains-a)
3. 继承关系(⽗类和⼦类的关系)is - a
4. 实现关系(接⼝和实现类)