软件构造 第四章第五章 复习重点

(一)LSP

子类型多态:客户端可以用统一的方法处理不同类型的对象

子类:更强的不变量,更弱的前置条件,更强的后置条件

1)子类可以增加方法、但不可删

2)子类型需要实现抽象类型中的所有未实现方法

3)子类型中重写的方法必须有相同或子类型的返回值

4)子类型中重写的方法必须使用同样类型的参数

5)子类型中重写的方法不能抛弃新的异常

LSP:前置条件不能强化、后置条件不能弱化、不变量要保持、子类型方法要保持、子类型方法参数:逆变;子类型返回值:协变;异常类型:协变。

(二)协变、反协变

协变:父类型-->子类型:越来越具体

返回值类型:不变或变得更具体

异常类型:不变或变得更具体

反协变、逆变:父类型-->子类型:越来约抽象

参数类型:不变或变得越来约抽象

例子:

(三)泛型的子类型化

ArrayList<String>是List<String>的子类型

List<String>不是List<Object>的子类型

类型擦除:类型擦除的详细定义:如果类型参数没有限制,则用它们的边界或Object来替换泛型类型中的所有类型参数。因此,产生的字节码只包含普通的类、接口和方法。

类型擦出的结果:<T>被擦出T变成了Object

例如:

泛型不是协变的

(四)设计模式

结构模式

1)适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

优点:1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点:1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

实现:

我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。

我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。具体实现图如下:

2)装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:多层装饰比较复杂。

下面给出一个实例:

3)Facade模式

意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

下面给出一个例子:

上图表示了画图的一个外观模式。

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。
ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo,我们的演示类使用 ShapeMaker 类来显示结果。

原文地址:https://www.cnblogs.com/boston-o/p/11074905.html

时间: 2024-09-29 01:14:07

软件构造 第四章第五章 复习重点的相关文章

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

构建之法第四、第五章读后感

第四第五章着重讲了合作的重要性,从两人合作到团队合作,编程开发都不是一件容易的事情,要注意许多要点. 代码书写的规范. 你写的代码不仅仅是给机器看的,给你看的,也是给其他人看的,是给合作的队友看的,在写的过程中要注意规范,要注意缩进.行宽.对齐等格式. 代码设计的规范. 函数中,你就只实现函数的具体功能,如构造函数,简单初始化所有数据成员即可. 代码复审. 找出代码的编辑错误.逻辑错误.算法错误跟潜在错误. 合作需要讲究技巧,要运用合理的方式影响合作的对方,尽量运用逻辑加感情,使对方能快速地接受

提供跟老男孩学Linux运维Shell编程实战的第四、第五章源代码

第四章是讲Shell变量知识进阶与实践: 第五章是讲变量的数值计算实践: 附件中包括源码,请下载. 该两章在学习时要注意相关事项: 1.注意标点符号的使用:例如,单引号,反引号,双引号等: 2.注意该要留空格的留空格: 3.注意特殊变量的作用: 4.内置变量的使用: 5.算术运算任的使用.

html (第四本书第五章参考)

上机1 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>百度音乐标签页面</title> <link href="css/上机练习1.css" rel="stylesheet" type="text/css"/> </head&

Java编程思想第四版 *第五章 个人练习

练习3:(1)创建一个带默认构造器(即无參构造器)的类.在构造器中打印一条消息.为这个类创建一个对象.P116 public class Test{ public Test(){ System.out.println("Hello Word"); } public static void main(String[] args) { new Test(); } /** * 执行结果 Hello Word */ } 练习4:(1)为前一个练习中的类加入一个重载构造器,令其接受一个字符參数.

第四章第五章 环境搭建和24个命令总结

GUN 和 GPL GUN's not Unix 递归写法,简写也是GUN 1. GUN 是84年自由软件资金会牵头弄的一个类unix操作系统,但是因为它不实用,而且总是跳票,所以并没有流行起来. 2. 但是它里面的很多软件是很好的,比如bash,这些都被用在了linux系统上 GPL general public license 通用公共许可 84年Richeal Stallman 发起了自由软件运动后不久,在其他人的协作下,创立了GPL Preamble The GNU General Pu

java编程思想第四版第五章习题

创建一个类, 它包含一个未初始化的String引用.验证该引用被Java初始化成了null package net.mindview.initialization; public class Test1 { public String str; public static void main(String[] args) { Test1 t = new Test1(); System.out.println(t.str); } } 返回结果 null 创建一个类, 它包含一个在定义时就被初始化了

spring实战第四版第五章pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion&

思科CCNA第四学期第五章答案

1 有关下列扩展 ACL 的说法中哪两项正确? (选择两项.) access-list 101 deny tcp 172.16.3.0 0.0.0.255 any eq 20 access-list 101 deny tcp 172.16.3.0 0.0.0.255 any eq 21 access-list 101 permit ip any any 拒绝从网络 172.16.3.0/24 始发的所有 FTP 流量. 会隐含拒绝所有流量. 会拒绝发往网络 172.16.3.0/24 的所有 F