软件设计师之一考就过:成绩版
考点26:类、封装、继承、多态
真题1:在面向对象方法中,两个及以上的类作为一个类的超类时,称为(多重继承),使用它可能造成子类中存在(二义性)的成员。
真题2:在面向对象方法中,多态指的是(客户类无需知道所调用方法的特定子类的实现)
真题3:多态有不同的形式,(过载)的多态是指同一个名字在不同上下文中所代表的含义不同。
类可以分为三种:实体类、接口类(边界类)和控制类。
实体类的对象表示现实世界中真实的实体,如人、物等。
接口类(边界类)的对象为用户提供一种与系统合作交互的方式,分为人和系统两大类,其中人的接口可以是显示屏窗口、Web 窗体、对话框、菜单、列表框、其他显示控制、条形码、二维码或者用户与系统交互的其他方法。系统接口涉及到把数据发送到其他系统,或者从其他系统接收数据。
控制类的对象用来控制活动流,充当协调者。
(3)抽象:通过**特定的实例抽取共同特征以后形成概念的过程。它强调主要特征,忽略次要特征。**一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象,抽象是一种单一化的描述,它强调给出与应用相关的特性,抛弃不相关的特性。
(4)封装:是一种信息隐蔽技术,将相关的概念组成一个单元模块,并通过一个名称来引用。面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的访问或修改只能通过对象对外提供的接口进行。
(5)继承:表示类之间的层次关系(父类与子类),这种关系使得某类对象可以继承另外一类对象的特征,又可分为单继承和多继承。
(6)多态:**不同的对象收到同一个消息时产生完全不同的结果。包括参数多态(不同类型参数多种结构类型)、包含多态(父子类型关系)、过载多态(类似于重载,一个名字不同含义)、强制多态(强制类型转换)四种类型。**多态由继承机制支持,将通用消息放在抽象层,具体不同的功能实现放在低层。
(7)覆盖:子类在原有父类接口的基础上,用**适合于自己要求的实现去置换父类中的相应实现。**即在子类中重定义一个与父类同名同参的方法。
(8)函数重载:与覆盖要区分开,函数重载与子类父类无关,且函数是同名不同参数。
(8)绑定是一个把过程调用和响应调用所需要执行的代码加以结合的过程。在一般的程序设计语言中,绑定是在编译时进行的,叫作静态绑定。动态绑定则是在运行时进行的,因此,一一个给定的过程调用和代码的结合直到调用发生时才进行。
考点27:面向对象、组合、聚合
真题1:采用面向对象方法进行软件开发,在分析阶段,架构师主要关注系统的(行为)。
面向对象技术进行软件开发时,需要进行面向对象分析(OOA)、面向对象设计(OOD)、面向对象实现和面向对象测试几个阶段。
◆面向对象的分析:是为了确定问题域,理解问题。包含五个活动:认定对象组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。主要关注系统的行为,明确系统需要提供什么服务。
◆面向对象需求建模:
◆面向对象的设计:是将采用面向对象技术将 OOA (面向对象分析)所创建的分析模型转化为设计模型,设计问题域的解决方案,与技术相关。OOD同样应遵循抽象、信息隐蔽、功能独立、模块化等设计准则。
◆面向对象的分析模型主要由顶层架构图、用例与用例图、领域概念模型构成; 设计模型则包含以包图表示的软件体系结构图、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等。
体系结构 = 架构
面向对象实现(面向对象程序设计),是系统实现人员选用面向对象程序设计语言,采用对象、类及其他相关概念进行程序设计,实现系统。
◆面向对象的设计原则:
(1)**单一责任原则。**就一个类而言,应该仅有一个引起它变化的原因。即,当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型责任
(2)开放-封闭原则。软件实体(类、模块、函数等)应该是可以扩展的,即开放的;但是不可修改的,即封闭的。
(3)**里氏替换原则。子类型必须能够替换掉他们的基类型。**即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。
(4)**依赖倒置原则。抽象不应该依赖于细节,细节应该依赖于抽象。**即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
(5)**接口分离原则。**不应该强迫客户依赖于它们不用的方法。接口属于客户不属于它所在的类层次结构。即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。(内部实现与接口是分离的)
(6)**共同重用。**在面向对象设计时,如果重用了包中的一个类,就要重用包中的所有类。
(7)**共同封闭。**进行面向对象系统设计时,针对包中的所有类对于同一类性质的变化。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他包不造成任何影响。
考点28:UML 类图、关联、组合、依赖
真题1:
答案:C、B、D
真题2:UML类图通常不用于对(对象快照)进行建模。
UML 类图对系统的词汇、简单的协作、逻辑数据库模式进行建模。
对象快照采用对象图进行建模。
真题3:当UML状态用于对系统、类或用例的动态方面建模时,通常是对(反应型对象)建模。
真题4:有关状态图的叙述中不正确的是(状态由事件触发),正确的是(动作可以在状态内执行,也可以在状态转换时执行)。
◆UML(统一建模语言):是一种可视化的建模语言,而非程序设计语言,支持从需求分析开始的软件开发的全过程。
◆依赖: 一个事物的语义依赖于另一个事物的语义的变化而变化
◆关联: 是一种结构关系,描述了一组链,链是对象之间的连接。分为组合和聚合,都是部分和整体的关系,其中组合事物之间关系更强。两个类之间的关联,实际上是两个类所扮演角色的关联,因此,两个类之间可以有多个由不同角色标识的关联。
组合关系:部分和整体具有共同的生命周期,人和大脑,人死了,大脑也就不存在了。大脑不能单独独立于人而存在的。
聚合关系:一只大雁和雁群,一只大雁是可以离开雁群的。
◆泛化: 一般/特殊的关系,子类和父类之间的关系
◆实现:一个类元指定了另一个类元保证执行的契约。
以上六个图形、符号都要记住。
UML 图:
◆类图:静态图,为系统的静态设计视图,展现一组**对象、接口、协作和它们之间的关系。**UML 类图如下:
上图中的 聚集 画错了,不应该是实心。
◆对象图:静态图,展现**某一时刻一组对象及它们之间的关系,为类图的某一快照。**在没有类图的前提下,对象图就是静态设计视图,如下:
◆用例图:静态图,展现了一组**用例、参与者以及它们之间的关系。用例图中的参与者是人、硬件或其他系统可以扮演的角色;用例是参与者完成的一系列操作,用例之间的关系有扩展、包含、泛化。**如下:
扩展、包含、泛化是用例图特有的。
扩展: 当执行A操作之后,B操作可能做也可能不做,B不是必要的。图像的箭头是 B 指向 A比如查询到书籍信息后,如果查询到不一致,则可能需要去修改书籍信息;如果查询到一致,则不用去修改书籍信息。再比如支付付钱,如果支付宝余额里的钱够,就直接支付了;如果不够,则会从银行卡里先转钱,再支付。这里的银行卡转钱的操作就是可能做也可能不做的。
包含: 当执行A操作之前,必须先执行B操作。图像的箭头是 A 指向 B 比如要登记、查询外借信息,必须先用户登录,不登录就没有权限登记、查询。
**泛化:**表示父子关系。一般与特殊的关系。比如动物与小鸟;班级与二班;学生与小明等
◆序列图: 即顺序图,动态图,是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动。 有同步消息(进行阻塞调用,调用者中止执行,等待控制权返回,需要等待返回消息,用实心三角箭头表示)、异步消息(发出消息后继续执行,不引起调用者阻塞,也不等待返回消息,由空心箭头表示)、返回消息(由从右到左的虚线箭头表示)三种,如下:
◆通信图:动态图,**又叫协作图,强调参加交互的对象的组织。**如下:
◆状态图:动态图,展现了一个状态机,描述单个对象在多个用例中的行为,,包括简单状态和组合状态。转换可以通过事件触发器触发,事件触发后相应的监护条件会进行检查。状态图中转换和状态是两个独立的概念,如下:图中方框代表状态,箭头上的代表触发事件,实心圆点为起点和终点。
比如收音机 按下了开机,就处于开机状态;按下暂停,就处于暂停状态等。
按下开机 就是 事件触发器;
按下开机 就不一定处于开机状态,还需要满足一定的监护条件,比如按下开机 但是并没有插电,所以状态不会转换;
迁移就是一个状态到另一个状态。
真题1:
真题2:UML构件图专注于系统的静态(实现)图。
◆活动图:动态图,是一种特殊的状态图,展现了在系统内从一个活动到另一个活动的流程。活动的分岔和汇合线是一条水平粗线。牢记下图中并发分岔、并发汇合、监护表达式、分支、流等名词及含义。每个分岔的分支数代表了可同时运行的线程数。活动图中能够并行执行的是在一个分岔粗线下的分支上的活动
◆构件图(组件图): 静态图,为系统静态实现视图,展现了一组构件之间的组织和依赖。 如下:
供接口:半圆
需接口:完整的圆
◆部署图: 静态图,为系统静态部署视图,部署图物理模块的节点分布。它与构件图相关,通常一个结点包含一个或多个构件。其依赖关系类似于包依赖,因此部署组件之间的依赖是单向的类似于包含关系。如下:
涉及物理、硬件的就是部署图。
UML 类图详解
UML 类图
- 用于描述系统中的类(对象)本身的组成和类(对象)之间的各种静态关系。
- 类之间的关系:
依赖、泛化(继承)、实现、关联、聚合与组合
强到弱依次为:组合>聚合>关联>依赖
。
1、泛化关系(generalization)
泛化:表示父子关系。一般与特殊的关系。比如动物与小鸟;班级与二班;学生与小明等
泛化关系其实就是继承关系:指的是一个类(称为子类、子接口)继承(extends)另外的一个类(称为父类、父接口)的功能,并可以增加自己额外的一些功能,继承是类与类或者接口与接口之间最常见的关系;
在Java中此类关系通过关键字 extends明确标识。
在UML类图中,继承通常使用 空心三角+实线 表示
代码层面:
// 普通用户
public class User {
private Long id;
private String name;
}
// 员工
public class Employee extends User {
private BigDecimal salary;
}
// 客户
public class Customer ectends User {
private String address;
}
2、实现关系(realization)
- 实现关系:指的是一个class类实现 interface接口(可以实现多个接口)的功能;实现是