HIT软件构造期末复习笔记第9~11章

第九讲: 面向复用的软件构造技术

·白盒框架:通过代码层面的继承进行框架扩展
·黑盒框架:通过实现特定接口、委派进行框架扩展

·LSP原则
(1)子类型可以增加方法,但不可以删除方法
(2)子类型需要实现抽象类型中所有未实现的方法
(3)子类型中重写的方法必须有相同或子类型的返回值或符合co-variance的参数
(4)子类型中的重写的方法必须使用同样类型的参数或符合contra-variance的参数
(5)子类型中重写的方法不能抛出额外的异常
(更强的不变量,更弱的前置条件,更强的后置条件)
子类型方法参数:逆变
子类型方法的返回值:协变
异常类型:协变

·协变:
父类型 --> 子类型:越来越具体的spec
返回值类型、异常类型:不变或变的更具体
·逆变:
父类型 --> 子类型:越来越具体的spec
参数类型:要不变或越来越抽象
(目前Java遇到此种情况,均当作overload看待)

·数组的子类型化
在这里插入图片描述

·泛型的子类型化
ArrayList是List的子类型,而List不是List的子类型
泛型不支持协变——类型擦除
List不是List的子类型!
在这里插入图片描述

·解决:使用通配符?

在这里插入图片描述
在这里插入图片描述

·组合和委派
委派:一个对象请求另一个对象的功能(复用的一种常见形式)
委派模式:通过运行时动态绑定,实现对其他类中代码的复用
委派发生在object层,继承发生在class层
分类:
(1)Dependency:临时性的delegation
(2)Association:永久性的delegation
(3)Composition:更强的association(难以变化)
(4)Aggregation:更弱的association(可动态变化)

·接口的组合
在这里插入图片描述

·CRP原则
在这里插入图片描述
在这里插入图片描述

·白盒框架的原理与实现
在这里插入图片描述

·黑盒框架的原理与实现
在这里插入图片描述

第十讲: 面向可维护性的构造技术

·可维护性的常见度量指标:
可维护性、可扩展性、灵活性、可适应性、可管理性、支持性
圈复杂度、代码行数、可维护性指数、继承的层次数、类之间的耦合度、单元测试的覆盖度

·聚合度、耦合度:高聚合+低耦合

·SOLID:
SRP:单一责任原则
OCP:开放-封闭原则
LSP:Liskov替换原则
ISP:接口聚合原则
DIP:依赖转置原则

SRP:不应有多于一个原因让你的ADT发生变化,否则就拆分开
OCP:
对扩展性的开放:模块的行为应该是可扩展的
对修改的封闭:模块自身的代码不应被修改;扩展模块行为的一般途径是修改模块的内部实现
在这里插入图片描述

LSP:
子类型必须能替代其基类型;派生类必须能够通过其基类的接口使用,客户端无需理解这二者的差异
ISP:
不能强迫客户端依赖于它不需要的接口,只提供必需的接口
DIP:
抽象的模块不应依赖于具体的模块,具体应依赖于抽象
(delegation时要通过interface建立联系,而非具体的子类)

·语法驱动的构造
从外部读取文本数据,在应用中做进一步的处理
用语法判断字符串是否合法,并解析成程序里使用的数据结构

·正则表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第十一讲: 面向可复用性和可维护性的设计模式

·创建型模式:

··工厂方法(“虚拟构造器”)
当客户端不知道要创建哪个具体类的实例,或不想在client代码中指明要具体创建的实例时,用工厂方法
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类

·结构型模式:

··Adapter(适配器模式)
将某个类、接口转换为client期望的其他形式;通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体的子类
在这里插入图片描述
在这里插入图片描述

··Decorator(装饰器模式)
为对象增加不同侧面的属性,对每个特性构造子类,通过委派机制增加到对象上
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

客户端需要一个具有多种特性的object,通过一层一层的装饰来实现

·行为型模式

··Strategy(策略模式)
有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而非写死在代码中;为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例
在这里插入图片描述

··Template method(模板模式)
做事情的步骤一致,但方法不一样;共性的步骤在抽象类中公共实现,差异化的步骤在各个子类中实现
使用继承和重写实现模板模式
在这里插入图片描述

··Iterator(迭代器模式)
客户端希望遍历被放入到容器、集合类中的一组ADT对象,无需关心容器的具体类型
在这里插入图片描述

为ADT实现iterable接口,实现该接口的集合对象是可遍历迭代的(只含iterator方法)
实现自己独特的Iterator迭代器(next、hasNext、remove),允许客户端应用这个迭代器进行显式或隐式的迭代遍历

··Visitor
将数据和作用于数据上的某种、某些种特定操作分离开来
为ADT预留一个将来可扩展功能的接入点,外部实现的代码功能能在不改变ADT本身的情况下通过delegation接入ADT

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值