RHZ'S BLOG | 个人分享

  • 首页
  • 笔记
  • 小日常
  • 音乐
  • 读书
  • 软件分享
YOLO
  1. 首页
  2. 笔记
  3. Code
  4. 正文

面向对象

2022年8月8日 271点热度 0人点赞 0条评论

Java语言是纯粹的面向对象的程序设计语言,面向对象的三种基本特征:继承、封装和多态

Java语言完全以对象为中心,最小程序单位是类,整个程序由一个一个类组成

面向对象的方式实际上由:OOA(面向对象分析)、OOD(面向对象设计)和OOP(面向对象编程)三个部分有机组成,目前业界统一采用UML(统一建模语言)来描述并记录OOA和OOD的结果

UML可以很好的使用图形来描述并记录软件分析、设计的结果。常用的UML图形有用例图、类图、组件图、部署图、顺序图、活动图和状态机图

1.面向对象

目前的软件开发领域有两种主流的开发方法:结构化开发方法和面向对象开发方法

面向对象可以提供更好的可重用性、可扩展性和可维护性

1.1 结构化程序设计简介

结构化程序设计方法主张按功能来分析系统需求,其主要原则可概括为自顶向下、逐步求精、模块化等。

结构化程序设计首先采用结构化分析(Structured Analysis,SA)方法对系统进行需求分析,然后使用结构化设计(Structured Design,SD)方法对系统进行概要设计、详细设计,最后采用结构化编程(Structured Program,SP)方法来实现系统。使用这种SA、SD和SP的方式可以较好地保证软件系统的开发进度和质量。

结构化程序设计里最小的程序单元是函数,每个函数都负责完成一个功能,用以接收一些输入数据,函数对这些输入数据进行处理,处理结束后输出一些数据。整个软件系统由一个个函数组成,其中作为程序入口的函数被称为主函数,主函数依次调用其他普通函数,普通函数之间依次调用,从而完成整个软件系统的功能

面向对象插图
结构化软件的逻辑结构示意图

结构化程序设计方式的局限性:

设计不够直观,与人类习惯思维不一致。采用结构化程序分析、设计时,开发者需要将客观世界模型分解成一个个功能,每个功能用以完成一定的数据处理。
适应性差,可扩展性不强。由于结构化设计采用自顶向下的设计方式,所以当用户的需求发生改变,或需要修改现有的实现方式时,都需要自顶向下地修改模块结构,这种方式的维护成本相当高。

1.2 程序的三种基本结构

目前在实际软件开发中抛弃了GOTO语句,在实际开发中更注重软件的可读性和可修改性

任何算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成

1.顺序结构

程序中的各个操作按照他们在源代码中的排列顺序依次执行的

面向对象插图1
顺序结构

2.选择结构

程序的处理需要根据某个特定的条件选择其中的一个分支执行,有单选择、双选择和多选择三种形式

面向对象插图2
双选择结构

单选择只有一个可供选择的分支

面向对象插图3
单选择结构

多选择结构有多个分支,程序执行方向根据判断条件来确定

面向对象插图4
多选择结构

3.循环结构

循环结构的基本形式 : 当型循环和直到型循环

面向对象插图5
循环结构

当型结构:

当条件为真时执行循环,先判断后执行,条件为假时,则退出循环体到达流程出口处

直到型结构:
直到条件为假时结束循环,入口处直接进入循环体,直到条件为假时结束循环回到流程出口

结构化程序设计中的任何结构都具有唯一的入口和出口,并且程序不会出现死循环

1.3面向对象程序设计简介

基本思想: 使用类、对象、继承、封装、消息等基本概念来进行程序设计,他映射的是客观世界,并保持客观世界中事务以及其相互关系的本来面貌

采用面向对象方式开发的软件系统,其最小的程序单元是类

面向对象插图6
面向对象方式开发的软件系统逻辑上的组成结构

面向对象的语言不仅使用类来封装一类事物的内部状态,这种状态数据对应于图中的Field;而且类会提供操作这些数据的方法还会为这类事物的行为特征提供相应的实现,这种实现也是方法。因此可得到:

Field(状态数据) + 方法(行为) = 类定义

面向对象比面向过程更简单、易用,面向对象时开发者希望从自然的认识、使用角度来定义和使用类,直接对客观世界进行模拟

定义一个类---->对应客观世界哪种事物
事物的状态---->定义Field
事物的行为---->定义方法

比如,猪八戒吃西瓜这一事件:

面向过程---以函数为中心,函数最大:
吃(猪八戒,西瓜);
面向对象---以对象为中心,对象最大:
猪八戒.吃(西瓜)

对比一下可知 : 面向对象的语句更接近自然语言的语法,主谓宾一目了然,直观易于理解

1.4 面向对象的基本特征

面向对象方法具有三个基本特征:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism),其中封装指的是将对象的实现细节隐藏起来,然后通过一些公用方法来暴露该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法;多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

java不支持多继承,以免引起继承结构的混乱

基于对象也使用了对象,但无法利用现有的对象模板产生新的对象类型,继而产生新的对象,没有继承的特点,多态需要继承,所以他不是面向对象(封装、继承和多态缺一不可)的。

面向对象实现了【继承和多态】而基于对象没有实现不要搞混两个概念
使用类库的人只是在形式上是面向对象的,但是思维上并没有转化,本质只是库函数的一种扩展

2.UML(统一建模语言)

OOA和OOD的分析、设计结果需要统一的符号来描述、交流并记录,UML就是这种用于描述、记录OOA和OOD结果的符号表示法。

UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言,它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发全过程。

面向对象插图7
UML的发展历史

UML图大致分为静态图和动态图两种

面向对象插图8
UML2.0组成

永远记住一点:很少有软件的开发完全遵从UML所列举的所有内容,不要把UML表示法当成一种负担,而应该把它当成一种工具,一种用于描述、记录软件分析设计的工具。最常用的UML图包括用例图、类图、组件图、部署图、顺序图、活动图和状态机图等。

2.1 用例图

用例图用于描述系统提供的系列功能,而每个用例则代表系统的一个功能模块。

用例图包括用例(以一个椭圆表示,用例的名称放在椭圆的中心或椭圆下面)、角色(Actor,也就是与系统交互的其他实体,以一个人形符号表示)、角色和用例之间的关系(以简单的线段来表示),以及系统内用例之间的关系。

用例图一般表示出用例的组织关系——要么是整个系统的全部用例,要么是完成具体功能的一组用例。

面向对象插图9
用例图

2.2 类图

类图表示系统中应该包含哪些实体,各实体之间如何关联

类在类图上使用包含三个部分的矩形来描述,最上面的部分显示类的名称,中间部分包含类的属性,最下面的部分包含类的方法。

面向对象插图10
类图中类的表示方法

类之间有三种基本关系:

关联(包括聚合、组合)

单向关联、多项关联,关联具有方向性

关联和属性很像,区别在于 : 类里的某个属性引用到另外一个实体时,则变成了关联。

关联关系包括两种特例:聚合和组合,它们都有部分和整体的关系,但通常认为组合比聚合更加严格。

面向对象插图11
当某个实体聚合成另一个实体时,该实体还可以同时是另一个实体的部分,例如,学生既可以是篮球俱乐部的成员,也可以是书法俱乐部的成员;当某个实体组合成另一个实体时,该实体则不能同时是一个实体的部分。聚合使用带空心菱形框的实线表示,组合则使用带实心菱形框的实线表示。
Teacher和Student之间的关联关系:它们是双向关联关系,而且使用了多重性来表示Teacher和Student之间存在1∶N的关联关系(1..*表示可以是一个到多个),即一个Teacher实体可以有1个或多个关联的Student实体;Student和BasketBallClub存在聚合关系,即1个或多个Student实体可以聚合成一个BasketBallClub实体;而Arm(手臂)和Student之间存在组合关系,2个Arm实体组合成一个Student实体。

泛化(与继承同一个概念)

指子类是一种特殊的父类,类与类之间的继承关系是非常普遍的,继承关系使用带空心三角形的实线表示

面向对象插图12
类之间的继承关系

提示

还有一种与继承类似的关系,类实现接口可视为一种特殊的继承,这种实现用带空心三角形的虚线表示。

依赖

如果一个类的改动会导致另一个类的改动,则称两个类之间存在依赖。依赖关系使用带箭头的虚线表示,其中箭头指向被依赖的实体。

通常而言,依赖是单向的,尤其是当数据表现和数据模型分开设计时,数据表现依赖于数据模型。

面向对象插图13
依赖

2.3 组件图

对于现代的大型应用程序而言,通常不只是单独一个类或单独一组类所能完成的,通常会由一个或多个可部署的组件组成。对Java程序而言,可复用的组件通常打包成一个JAR、WAR等文件

组件图提供系统的物理视图,它的用途是显示系统中的软件对其他软件组件(例如,库函数)的依赖关系

组件图通常包含组件、接口和Port等图元,UML使用带

面向对象插图14

符号的矩形来表示组件,使用圆圈代表接口,使用位于组件边界上的小矩形代表Port

组件接口的两种表现形式:
用一条实线连接到组件边界的圆圈表示
使用位于组件内部的圆圈表示
--------------------------------------------
PS-组件除了可以对外提供服务接口之外,组件还可能依赖于某个接口,组件依赖于某个接口使用一条带半圆的实线来表示
面向对象插图15
组件与接口

一个简单的Order组件,该组件对外提供一个Payable接口,该组件需要依赖于一个CustomerLookup接口——通常这个CustomerLookup接口也是系统中已有的接口

2.4 部署图

部署图用于描述软件系统如何部署到硬件环境中,它的用途是显示软件系统不同的组件将在何处物理运行,以及它们将如何彼此通信。

部署图中的符号包括组件图中所使用的符号元素,另外还增加了节点的概念:节点是各种计算资源的通用名称,主要包括处理器和设备两种类型,两者的区别是处理器能够执行程序的硬件构件(如计算机主机),而设备是一种不具备计算能力的硬件构件(如打印机)。UML中使用三维立方体来表示节点,节点的名称位于立方体的顶部。图2.17显示了一个简单的部署图。部署图中的符号包括组件图中所使用的符号元素,另外还增加了节点的概念:节点是各种计算资源的通用名称,主要包括处理器和设备两种类型,两者的区别是处理器能够执行程序的硬件构件(如计算机主机),而设备是一种不具备计算能力的硬件构件(如打印机)。UML中使用三维立方体来表示节点,节点的名称位于立方体的顶部。图2.17显示了一个简单的部署图。

面向对象插图16
部署图

图解:

整个应用分为5个组件:Student、Administrator、应用持久层、Student数据库和UI界面组件

该应用需要部署在4个物理节点上,其中普通客户端无须部署任何组件,直接使用客户端浏览器即可;管理者客户机上需要部署UI界面;应用服务器上需要部署Student、Administrator和应用持久层三个组件;而数据库服务器上需要部署Student数据库。


2.5 顺序图

顺序图有两个维度:垂直维度,以发生的时间顺序显示消息/调用的序列;水平维度,显示消息被发送到的对象实例。

顺序图的绘制非常简单。顺序图的顶部每个框表示每个类的实例(对象),框中的类实例名称和类名称之间用冒号或空格来分隔,例如myReportGenerator : ReportGenerator。如果某个类实例向另一个类实例发送一条消息,则绘制一条指向接收类实例的带箭头的连线,并把消息/方法的名称放在连线上面。顺序图的绘制非常简单。

对于某些特别重要的消息,还可以绘制一条带箭头的指向发起类实例的虚线,将返回值标注在虚线上,绘制带返回值的信息可以使得序列图更易于阅读。

面向对象插图17
用户登录顺序图

当绘制顺序图时,消息可以向两个方向扩展,消息穿梭在顺序图中,通常应该把消息发送者与接收者相邻摆放,尽量避免消息跨越多个对象。对象的激活期不是其存在的时间,而是它占据CPU的执行时间,绘制顺序图时,激活期要精确。
阅读顺序图也非常简单,通常从最上面的消息开始(也就是时间上最先开始的消息),然后沿消息方向依次阅读。

顺序图擅长表现对象之间的协作顺序,不擅长表现行为的精确定义

顺序图比通信图多了时间的概念


2.6 活动图

活动图和状态机图都被称为演化图

活动图:用于描述用例内部的活动或方法的流程,如果除去活动图中的并行活动描述,它就变成流程图。
状态机图:描述某一对象生命周期中需要关注的不同状态,并会详细描述刺激对象状态改变的事件,以及对象状态改变时所采取的动作。

演化图五要素:

  • 状态:状态是对象响应事件前后的不同面貌,状态是某个时间段对象所保持的稳定态
  • 事件:来自对象外界的刺激,通常的形式是消息的传递,只是相对对象而言发生了事件。事件是对象状态发生改变的原动力。
  • 动作:动作是对象针对所发生事件所做的处理,实际上通常表现为某个方法被执行。
  • 活动:活动是动作激发的后续系统行为。
  • 条件:条件指事件发生所需要具备的条件。

对于激发对象状态改变的事件,通常有如下两种类型。

  • 内部事件:从系统内部激发的事件,一个对象的方法(动作)调用(通过事件激活)另一个对象的方法(动作)
  • 外部事件:从系统边界外激发的事件,例如用户的鼠标、键盘动作。
面向对象插图18
活动图

活动图相较于传统流程图可以使用并行分支分出多条并行活动


2.7 状态机图

状态机图表示某个对象所处的不同状态和该类的状态转换信息,我们只对“感兴趣的”对象绘制状态机图。也就是说,在系统活动期间具有三个或更多潜在状态的对象才需要考虑使用状态机图进行描述。

状态机图的符号集包括5个基本元素:

  • 初始状态--实心圆绘制--只有一个;
  • 状态之间的转换--带箭头的线段绘制;
  • 状态--圆角矩形绘制;
  • 判断点--空心圆来绘制;
  • 一个或者多个终止点--内部包含实心圆的圆绘制。
面向对象插图19
状态机图

描绘了Hibernate实体具有3个状态:瞬态、持久化和脱管。当程序通过new直接创建一个对象时,该对象处于瞬态;对一个瞬态的对象执行save()、saveOrUpdate()方法后该对象将会变成持久化状态;对一个持久化状态的实体执行delete()方法后该对象将变成瞬态;持久化状态和脱管状态也可以相互转换。

不要对系统的每个对象都画状态机图,只对真正需要关心各个状态的对象才绘制状态机图


3. Java的面向对象特征

3.1 一切都是对象

在Java语言中,除了8个基本数据类型值之外,一切都是对象,其他8种基本数据类型被分别封装成了包装类。主要用于将字符串转换成基本的数据类型。引用数据类型包括:数组、类,接口

对象不仅能表示具体的事物,还能表示抽象的规则、计划或事件

Java语言不允许直接访问对象,而是通过对对象的引用来操作对象

3.2 类和对象

具有相同或相似性质的一组对象的抽象就是类,类是对一类事物的描述,是抽象的、概念上的定义;对象是实际存在的该类事物的个体,因而也称为实例(instance)。
对象的抽象化是类,类的具体化就是对象,也可以说类的实例是对象。类用来描述一系列对象,类概述每个对象应包括的数据,类概述每个对象的行为特征。因此,可以把类理解成某种概念、定义,它规定了某类对象所共同具有的数据和行为特征。

类之间的两种主要的结构关系

一般→特殊关系:这种关系就是典型的继承关系,Java语言使用extends关键字来表示这种继承关系,Java的子类是一种特殊的父类。因此,这种一般→特殊的关系其实是一种“is a”关系。

苹果is a水果,水果的范围是不是比苹果的范围大呢?所以常常认为:父类也可被称为大类,子类也可被称为小类

整体→部分结构关系:也被称为组装结构,这是典型的组合关系,Java语言通过在一个类里保存另一个对象的引用来实现这种组合关系。因此,这种整体→部分结构关系其实是一种“has a”关系。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2022年8月9日

RHZ

即使单枪匹马,我亦勇敢无畏

点赞
< 上一篇
下一篇 >

文章评论

取消回复
归档
  • 2023年2月
  • 2022年12月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2021年12月
  • 2021年11月
  • 2021年10月
  • 2021年8月
  • 2021年7月

COPYRIGHT © 2022 RHZ的博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2022008933号-1