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