计算机系列之面向对象、设计模式

24、面向对象技术(重要,10分左右)

1、面向对象开发

(1)对象:由数据及其操作所构成的封装体,是系统中用来描述客观事务的个实体,是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成。

(2)类:现实世界中实体的形式化描述,类将该实体的属性(数据)和操作(函数)封装在一起。对象是类的实例,类是对象的模板。


类可以分为三种:实体类、接口类(边界类)和控制类。

实体类的对象表示现实世界中真实的实体,如人、物等。

接口类(边界类)的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏窗口、Web 窗体、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法。系统接口涉及到把数据发送到其他系统,或者从其他系统接收数据。

控制类的对象用来控制活动流,充当协调者。


(3)抽象:通过**特定的实例抽取共同特征以后形成概念的过程。它强调主要特征,忽略次要特征。**一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象,抽象是一种单一化的描述,它强调给出与应用相关的特性,抛弃不相关的特性。

(4)封装:是一种信息隐蔽技术,将相关的概念组成一个单元模块,并通过一个名称来引用。面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的访问或修改只能通过对象对外提供的接口进行。

(5)继承:表示类之间的层次关系(父类与子类),这种关系使得某类对象可以继承另外一类对象的特征,又可分为单继承和多继承。

(6)多态:**不同的对象收到同一个消息时产生完全不同的结果。包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。**多态由继承机制支持,将通用消息放在抽象层,具体不同的功能实现放在低层。

(7)接口:描述对操作规范的说明,其只说明操作应该做什么,并没有定义操作如何做。

(8)消息:体现对象间的交互,通过它向目标对象发送操作请求。


(9)覆盖:子类在原有父类接口的基础上,用**适合于自己要求的实现去置换父类中的相应实现。**即在子类中重定义一个与父类同名同参的方法。

(10)函数重载:与覆盖要区分开,函数重载与子类父类无关,且函数是同名不同参数。


(11)绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定。动态绑定则是在运行时进行的,因此,一一个给定的过程调用和代码的结合直到调用发生时才进行。

面向对象的分析:是为了确定问题域,理解问题。包含五个活动:认定对象组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。

面向对象需求建模:

在这里插入图片描述

面向对象的设计:设计分析模型和实现相应源代码,设计问题域的解决方案,与技术相关。OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计准则。


◆面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成; 设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。

在这里插入图片描述

体系结构 = 架构



◆面向对象的设计原则:
(1)**单一责任原则。**就一个类而言,应该仅有一个引起它变化的原因。即,当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任

(2)开放-封闭原则。软件实体(类、模块、函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。

(3)**里氏替换原则。子类型必须能够替换掉他们的基类型。**即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。

(4)**依赖倒置原则。抽象不应该依赖于细节,细节应该依赖于抽象。**即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

(5)**接口分离原则。**不应该强迫客户依赖于它们不用的方法。接口属于客户不属于它所在的类层次结构。即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。(内部实现与接口是分离的)


一般来说,对面向对象软件的测试可分为下列4个层次进行。

(1)算法层。测试类中定义的每个方法,基本上相当于传统软件测试中的单元测试。

(2)**类层。测试封装在同一个类中的所有方法与属性之间的相互作用。**在向面对象软件中类是基本模块,因此可以认为这是面向对象测试中所特有的模块测试。

(3)模板层。测试一组协同工作的类之间的相互作用,大体上相当于传统软件测试中的集成测试,但是也有面向对象软件的特点(例如,对象之间通过发送消息相互作用)。

(4)系统层。把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。

算法层、类层相当于单元测试;

模板层相当于集成测试;

系统层相当于系统测试;

2、统一建模语言 UML


◆UML(统一建模语言):是一种可视化的建模语言,而非程序设计语言,支持从需求分析开始的软件开发的全过程。
◆从总体上来看,UML的结构包括构造块、规则和公共机制三个部分。

(1)构造块。UML有三种基本的构造块,分别是**事物(thing)、关系(relationship)和图(diagram)。**事物是UML的重要组成部分,关系把事物紧密联系在一起,图是多个相互关联的事物的集合。

(2)公共机制。公共机制是指达到特定目标的公共UML方法。

(3)规则。规则是构造块如何放在一起的规定。

在这里插入图片描述

◆结构事物:模型的静态部分,如类、接口、用例、构件等;
◆行为事物:模型的动态部分,如交互、活动、状态机;
◆分组事物:模型的组织部分,如包,
◆注释事物:模型的解释部分,依附于一个元素或-组元素之上对其进行约束或解释的简单符号。


依赖: 一个事物的语义依赖于另一个事物的语义的变化而变化

关联: 是一种结构关系,描述了一组链,链是对象之间的连接。分为组合和聚合,都是部分和整体的关系,其中组合事物之间关系更强。两个类之间的关联,实际上是两个类所扮演角色的关联,因此,两个类之间可以有多个由不同角色标识的关联。

组合关系:部分和整体具有共同的生命周期,人和大脑,人死了,大脑也就不存在了。大脑不能单独独立于人而存在的。

聚合关系:一只大雁和雁群,一只大雁是可以离开雁群的。

泛化: 一般/特殊的关系,子类和父类之间的关系

实现:一个类元指定了另一个类元保证执行的契约。

在这里插入图片描述

以上六个图形、符号都要记住。


UML 图:

在这里插入图片描述

类图:静态图,为系统的静态设计视图,展现一组**对象、接口、协作和它们之间的关系。**UML 类图如下:

在这里插入图片描述

上图中的 聚集 画错了,不应该是实心。

对象图:静态图,展现**某一时刻一组对象及它们之间的关系,为类图的某一快照。**在没有类图的前提下,对象图就是静态设计视图,如下:

在这里插入图片描述

用例图:静态图,展现了一组**用例、参与者以及它们之间的关系。用例图中的参与者是人、硬件或其他系统可以扮演的角色;用例是参与者完成的一系列操作,用例之间的关系有扩展、包含、泛化。**如下:

扩展、包含、泛化是用例图特有的。

在这里插入图片描述

扩展: 当执行A操作之后,B操作可能做也可能不做,B不是必要的。图像的箭头是 B 指向 A比如查询到书籍信息后,如果查询到不一致,则可能需要去修改书籍信息;如果查询到一致,则不用去修改书籍信息。再比如支付付钱,如果支付宝余额里的钱够,就直接支付了;如果不够,则会从银行卡里先转钱,再支付。这里的银行卡转钱的操作就是可能做也可能不做的。

包含: 当执行A操作之前,必须先执行B操作。图像的箭头是 A 指向 B 比如要登记、查询外借信息,必须先用户登录,不登录就没有权限登记、查询。

**泛化:**表示父子关系。一般与特殊的关系。比如动物与小鸟;班级与二班;学生与小明等

序列图: 即顺序图,动态图,是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。同步消息(进行阻塞调用,调用者中止执行,等待控制权返回,需要等待返回消息,用实心三角箭头表示)、异步消息(发出消息后继续执行,不引起调用者阻塞,也不等待返回消息,由空心箭头表示)、返回消息(由从右到左的虚线箭头表示)三种,如下:

在这里插入图片描述

通信图:动态图,**又叫协作图,强调参加交互的对象的组织。**如下:

在这里插入图片描述

状态图:动态图,展现了一个状态机,描述单个对象在多个用例中的行为,,包括简单状态和组合状态。转换可以通过事件触发器触发,事件触发后相应的监护条件会进行检查。状态图中转换和状态是两个独立的概念,如下:图中方框代表状态,箭头上的代表触发事件,实心圆点为起点和终点。

在这里插入图片描述

比如收音机 按下了开机,就处于开机状态;按下暂停,就处于暂停状态等。

按下开机 就是 事件触发器;

按下开机 就不一定处于开机状态,还需要满足一定的监护条件,比如按下开机 但是并没有插电,所以状态不会转换;

迁移就是一个状态到另一个状态。

活动图:动态图,是一种特殊的状态图,展现了在系统内从一个活动到另一个活动的流程。活动的分岔和汇合线是一条水平粗线。牢记下图中并发分岔、并发汇合、监护表达式、分支、流等名词及含义。每个分岔的分支数代表了可同时运行的线程数。活动图中能够并行执行的是在一个分岔粗线下的分支上的活动

在这里插入图片描述

构件图(组件图): 静态图,为系统静态实现视图,展现了一组构件之间的组织和依赖。 如下:

在这里插入图片描述

供接口:半圆

需接口:完整的圆

部署图: 静态图,为系统静态部署视图,部署图物理模块的节点分布。它与构件图相关,通常一个结点包含一个或多个构件。其依赖关系类似于包依赖,因此部署组件之间的依赖是单向的类似于包含关系。如下:

在这里插入图片描述

涉及物理、硬件的就是部署图。

◆UML4+1视图:视图是由图实现,是图的抽象。
(1)逻辑视图。逻辑视图也称为设计视图,它表示了设计模型中在架构方面具有重要意义的部分,即类、子系统、包和用例实现的子集。

(2)进程视图,进程视图是可执行线程和进程作为活动类的建模,它是逻辑视图的一次执行实例,描述了并发与同步结构。

(3)实现视图。实现视图对组成基于系统的物理代码的文件和构件进行建模。

(4)部署视图。部署视图把**构件部署到一组物理节点上,**表示软件到硬件的映射和分布结构。

(5)用例视图。用例视图是最基本的需求分析模型。

在这里插入图片描述


3、设计模式


◆架构模式:软件设计中的高层决策,例如C/S结构就属于架构模式,架构模式反映了开发软件系统过程中所作的基本设计决策。

◆设计模式:每一个设计模式描述了一个在我们周围**不断重复发生的问题,以及该问题的解决方案的核心。**这样,你就能一次又一次地使用该方案而不必做重复劳动.设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便的复用成功的的设计和体系结构。四个基本要素:模式名称、问题(应该在何时使用模式)、解决方案(设计的内容)、效果(模式应用的效果)

◆惯用法:是最低层的模式,关注**软件系统的设计与实现,实现时通过某种特定的程序设计语言来描述构件与构件之间的关系。**每种编程语言都有它自己特定的模式,即语言的惯用法。例如引用一计数就是C++语言中的一种惯用法。

在这里插入图片描述

在这里插入图片描述

Factory Method 工厂方法模式:只生产鼠标的工厂,可以生产、创造不同品牌的鼠标(对象),比如华为、小米等。子类决定实例化

Abstract Factory 抽象工厂模式:工厂概念的进一步抽象,有生产鼠标的工厂,有生产键盘的工厂,有生产屏幕的工厂等。工厂扩展后,就可以是鼠标工厂、键盘工厂、屏幕工厂。比如这里定义工厂具有 create 即 生产这个行为;需要鼠标工厂,就扩展工厂为 createMouse等。抽象接口

Builder 构建器模式:比如创建一个人物,要创建身体、脸型、发型进而组合成一个人物。通过提供创建不同身体(胖的、瘦的)、创建不同脸型(大的、小的)创建不同发型(长发、短发)等,进而组合成一个人物。类和构造分离

Prototype 原型模式:原来有个原型、对象,然后直接Copy 这个对象的代码,然后改一改变成新的对象、原型。 原型实例,拷贝。

在这里插入图片描述

Adapter 适配器模式:转换,兼容接口。

Bridage 桥接模式:抽象和实现分离。 比如学习资料,抽象层可以分为纸质资料、电子资料;具体的载体、实现可以是文字、图片。这样就在抽象和实现之间构建了一个桥梁:

在这里插入图片描述

这样就有了 纸质文字、纸质图片、电子文字、电子图片四种形式了。

抽象和实现是分开的,都可以单独扩展,比如扩展实现的增加一个视频形式等。

Composite 组合模式:整体-部分,树形结构。文件夹与文件、总公司与各地子公司。

Decorator 装饰模式:运行时、动态增加额外职责。

Facade 外观模式:对外统一接口。比如智能家居的一个家居模式,一个家居模式的接口、按钮,就可以把电视的接口、风扇的接口、电灯的接口一次唤起

Flyweight 享元模式:细粒度,共享。汉字、语音识别、输入法等,当要编写一句话的时候,不能每一句话中的每个字都单独创建一个对象,这个时候就把常见的比如2000个字创建2000个对象,当要写一句话的时候,就从共享的2000个对象中抽出 从而组合成这句话,这样就永远是2000个对象。

Proxy 代理模式:代理控制,比如软件的快捷方式。

在这里插入图片描述

Chain of Responsibility 职责链模式:传递请求、职责链接。比如请假流程,对个对象处理请求等。

Command 命令模式:日志记录、可撤销。

Interperter 解释器模式:解释器、虚拟机。比如游戏中自定义游戏地图、自定义游戏难度等

Iterator 迭代器模式:顺序访问,不暴露内部。

Mediator 中介者模式:不直接引用。中介:买方、卖方、中介。ESB(企业服务总线) 就是中介者模式。

在这里插入图片描述

Memento 备忘录模式:保存、恢复。比如游戏的存档、读档。

Oserver 观察者模式:通知、自动更新。比如订阅微信公众号,公众号文章更新就会通知订阅它的人。

State 状态模式:状态变成类,比如会员模式:超级会员、普通会员等。会员等级发生改变时,对应的权限、行为也发生改变了。

Strategy 策略模式:算法替换

Template Method 模板方法模式:使用模板。

Visitor 访问者模式:数据和操作分离,比如人的、类的固有属性、数据结构是不会改变的:比如名字、身份证,但是行为是改变的:比如幼儿时是爬着的,长大了就是能走、能跑了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/609123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YOLOV5更换转置卷积,助力涨点!

由于转置卷积是nn库自带的,所以我们直接找到models文件夹中的yolo.py文件中的 parse_model函数,再在如下图的地方添加转置卷积模块 # YOLOv5 🚀 by Ultralytics, AGPL-3.0 license """ YOLO-specific modules.Usage:$ python models/yolo.py --cfg yolov5s.…

ARM 交叉编译搭建SSH

一、源码下载 zlib:zlib-1.3.1.tar.xz openssl:openssl-0.9.8d.tar.gz openssh:openssh-4.6p1.tar.gz 二、交叉编译 1、zlib 编译参考这里 2、openssl tar -xf openssl-0.9.8d.tar.gz ./Configure --prefix/opt/ssh/openssl os/compile…

一对一WebRTC视频通话系列(五)——综合调试和功能完善

本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习&#xff0c;梳理总结后写下文章&#xff0c;对音视频相关内容感…

猿匹配,一款使用环信实现的一个开源聊天应用含服务器

前言 之前写了一篇Android开发集成聊天环信SDK3.x简单开始&#xff0c;然后最近得空开发了一款使用环信实现的实时聊天应用&#xff0c;包含简单的服务器端&#xff0c;并开源给大家&#xff0c;有兴趣的同学可以一起搞一下&#xff0c;详细介绍看下边吧 上代码 服务器&#…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及全生命周期成本的公交光伏充电站储能优化配置方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元

&#x1f989; AI新闻 &#x1f680; 清华团队开发首个AI医院小镇模拟系统 摘要&#xff1a;来自清华的研究团队最近开发出了一种创新的模拟系统&#xff0c;名为"Agent Hospital"&#xff0c;该系统能够完全模拟医患看病的全流程&#xff0c;其中包括分诊、挂号、…

【八十五】【算法分析与设计】单调栈的全新版本,两个循环维护左小于和右小于信息,84. 柱状图中最大的矩形,85. 最大矩形

84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&am…

Go的安装与配置

安装 https://go.dev/dl/ 以Windows上安装为例&#xff1a; 下一步下一步&#xff0c;记住安装位置 安装完成后 win rcmd 键入go version检查是否安装成功 配置 Go 工作区 Go 在组织项目文件方面与其他编程语言不同。 Go 是在工作区的概念下工作的。但是从版本 1.11 开始&…

docker-compose部署java项目

docker-compose是定义和运行多容器的工具。换句话说就是通过配置yml文件来运行容器&#xff0c;简化了每次输入docker run等命令&#xff0c;把这些命令配置在yml文件统一管理&#xff0c;而且可以用一个yml文件一次启动多个容器&#xff0c;启动时还可以设置各个容器的依赖关系…

远程开机与远程唤醒BIOS设置

远程开机与远程唤醒BIOS设置 在现代计算机应用中&#xff0c;远程管理和控制已成为许多企业和个人的基本需求。其中&#xff0c;远程开机和远程唤醒是两项非常实用的功能。要实现这些功能&#xff0c;通常需要在计算机的BIOS中进行一些特定的设置。以下是对远程开机和远程唤醒…

如何判断nat网络?如何内网穿透

大家都清楚&#xff0c;如果你想开车&#xff0c;就必须要给车上一个牌照&#xff0c;随着车辆越来越多&#xff0c;为了缓解拥堵&#xff0c;就需要摇号&#xff0c;随着摇号的人数越来越多&#xff0c;车牌对于想开车的人来说已经成为奢望。在如今的IPv4时代&#xff0c;我们…

全自动减压器法二氧化碳气容量测试仪:饮料行业的革新与未来

全自动减压器法二氧化碳气容量测试仪&#xff1a;饮料行业的革新与未来 一、引言 在追求品质与效率的现代饮料生产领域&#xff0c;全自动减压器法二氧化碳气容量测试仪凭借其高精度、高效率及无人工干预的显著优势&#xff0c;正逐渐成为行业的标杆。特别是在碳酸饮料的生产中…

USB系列五:USB设备配置(重要)

在USB总线接口协议中&#xff0c;对于USB外部设备功能特征是通过端点&#xff08;Endpoint&#xff09;、配置&#xff08;Configuration&#xff09;和接口&#xff08;Interface&#xff09;来描述的&#xff0c;这些就是典型的USB描述符。 USB主机通过设备请求来读取外部设…

并行执行线程资源管理方式——《OceanBase 并行执行》系列 3

在某些特定场景下&#xff0c;由于需要等待线程资源&#xff0c;并行查询会遇到排队等待的情况。本篇博客将介绍如何管理并行执行线程资源&#xff0c;以解决这种问题。 《OceanBase并行执行》系列的内容分为七篇博客&#xff0c;本篇是其中的第三篇。前2篇如下&#xff1a; 一…

分布式与一致性协议之Quorum NWR算法

Quorum NWR算法 概述 不知道你在工作中有没有遇到过这样的事情:你开发实现了一套AP型分布式系统&#xff0c;实现了最终一致性&#xff0c;且业务接入后运行正常&#xff0c;一切看起来都那么美好。 可是突然有同事说&#xff0c;我们要拉这几个业务的数据做实时分析&#xf…

AXI4读时序在AXI Block RAM (BRAM) IP核中的应用

在本文中将展示描述了AXI从设备&#xff08;slave&#xff09;AXI BRAM Controller IP核与Xilinx AXI Interconnect之间的读时序关系。 1 Single Read 图1展示了一个从32位BRAM&#xff08;Block RAM&#xff09;进行AXI单次读取操作的时序示例。 图1 AXI 单次读时序图 在该…

webpack如何自定义一个loader

我们在使用脚手架的搭建项目的时候往往都会帮我们配置好所需的loader&#xff0c;接下来讲一下我们要如何自己写一个loader应用到项目中&#xff08;完整代码在最后&#xff09; 1. 首先搭建一个项目并找到webpack配置文件&#xff08;webpack.config.js&#xff09; 在modul…

clickhouse学习笔记06

ClickHouse的建表和引擎选择思路讲解 ClickHouse的常见注意事项和异常问题排查 ClickHouse高性能查询原因剖析-稀疏索引 ClickHouse高性能写入剖析-LSM-Tree存储结构

嵌入式开发十:STM32开发基础入门知识补充

本篇博客主要是针对前面STM32入门基础知识的补充&#xff0c;为后面的真正开发学习做好准备。 目录 一、IO 引脚复用器和映射 1.1 引脚复用的概念 1.2 如何设计实现复用 1.3 复用功能固件库配置过程 二、STM32 NVIC 中断优先级管理 2.1 NVIC中断优先级管理结构体介绍 …

力扣每日一题-统计已测试设备-2024.5.10

力扣题目&#xff1a;统计已测试设备 题目链接: 2960.统计已测试设备 题目描述 代码思路 根据题目内容&#xff0c;第一感是根据题目模拟整个过程&#xff0c;在每一步中修改所有设备的电量百分比。但稍加思索&#xff0c;发现可以利用已测试设备的数量作为需要减少的设备电…
最新文章