可复用设计模式(1)

文章目录

  • 面向可理解性的构造
    • 代码的可理解性
      • 如何编写易于理解的代码
  • 可复用性编程
    • 什么是软件复用
      • 软件复用的两个观点
      • 复用的好处
      • 复用的类型
    • 可复用实现的级别
      • 源代码级别的复用
      • 模块级别的复用:类,抽象类,接口
        • 复用的方法:继承和委托
      • 库级别的复用:
      • 对可复用性的外部观察
      • 白盒框架和黑盒框架
    • 设计可复用的软件
      • 设计可复用的类--LSP
        • 行为子结构
        • 复合继承原则
        • 委派的类型

面向可理解性的构造

代码的可理解性

如何编写易于理解的代码

遵循命名规范
限制代码行的最大长度,文件的最大LOC
足够的注释
代码有好的布局:缩进,空行,对齐,分块等。
避免多层嵌套,增加复杂度

可复用性编程

什么是软件复用

软件复用是使用现有软件组件实施或更新软件系统的过程

软件复用的两个观点

1.面向复用编程:开发出可复用的软件
2.基于复用编程:利用已有的可复用软件搭建应用系统

复用的好处

1.降低成本和开发时间
2.复用的代码经过测试,可靠,稳定。
3.产出标准化,在不同应用中保持一致。

复用的类型

白盒复用:源代码可见,可修改和拓展
黑盒复用:源代码不可见,不能修改

可复用实现的级别

源代码级别的复用

模块级别的复用:类,抽象类,接口

复用类:
源码并非是必要的,可能只需要类文件或jar
只需要将这个类加入到类路径
可以使用工具javap获得一个类的public方法

复用的方法:继承和委托

继承
1.类扩展了现有类的属性和行为
2.可能会Override现有的行为
3.通常需要在实施之前设计继承层次结构
委托
委托是简单的将一个对象连接到另一个对象上,使另一个对象获得这个对象方法的子集
如下图所示就是委托

可复用设计模式(1)_第1张图片

库级别的复用:

方法:library,framework
library:
库定义:一组提供可复用功能的类和方法
framework:
框架定义:一组具体类,抽象类及其之间的连接关系
作为主程序加以执行,执行过程中调用开发者所写的程序。

对可复用性的外部观察

Type Variation 类型可变
1.能够复用的部分应该类型参数化,以适应不同的数据类型
2.复用的部分应该一般化
3.适用不同的类型,且满足LSP
Implementation Variation 实现可变
ADT 有多种不同的实现,提供不同的representation和abstract function,但具有同样的specification,从而可以适用不同的应用场景
功能分组
提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作
RI
内部实现可能会经常变化,但客户端不应受到影响。
Factoring Out Common Behaviors:
将共同的行为抽象出来,形成可复用实体。

白盒框架和黑盒框架

白盒框架
1.通过继承和动态绑定实现可扩展性
2.通过继承框架基类并重写预定义的hook方法来扩展现有功能。
3.通常使用模板方法模式等设计模式,来覆盖hook方法。
黑盒框架
1.通过为可插入框架的组件定义接口来实现可扩展性

2.通过定义符合特定接口的组件来复用现有功能。
3.这些组件可通过委派与框架集成。

设计可复用的软件

设计可复用的类–LSP

行为子结构

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

Animal a = new Animal();
Animal c1 = new Cat();
Cat c2 = new Cat();

在使用a的场景都可以用c1,c2不会有什么问题
在java的静态类型检查中,编译器强调了一些规则:
1. 子类型可以增加方法但不可以删
2. 子类型需要实现抽象类型中的所有未实现方法
3. 子类型中重写的方法必须有相同或子类型的返回值
4. 子类型中重写的方法必须使用同样类型的参数。
5. 子类型重写的方法不能抛出额外的异常

复合继承原则

定义:类应当通过它们之间的组合达到多态表现和代码复用,而不仅仅是从基础类或父类继承。

委派的类型

1.临时性委派:调用类里的方法,而不将其作为属性。
2.永久性委派:类中有其他类的实例来作为一个变量。
3.更强的委派:组合,将一些简单的对象组合成为一个更大的对象。

你可能感兴趣的:(学习笔记)