(1) Source code reuse
复用别人的代码,将部分/全部复制/粘贴到程序中。存在限制:
1.维修问题
– 需要在多个地方更正代码
– 太多代码无法使用(很多版本)
2. 过程出错风险高
3. 可能需要了解所用软件的工作原理
4.需要访问源代码
几个源代码网站:
grepcode.com
github.com/search
searchcode.com
(2)Module-level reuse: class/interface
类的重用:
1.类是代码重用的原子单元
– 不需要源代码,类文件或 jar/zip
– 只需要包含在类路径中
– 可以使用 javap 工具获取类的公共方法头
2. 文档非常重要(Java API)
3.封装有助于重用
4.更少的代码来管理
5.版本控制,向后兼容性仍然存在问题
6.需要将相关类打包在一起——静态链接
继承(inheritance):
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
class 父类 {
}
class 子类 extends 父类 {
}
继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
-
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
委托(delegation):
委托是当一个对象依赖另一个对象功能的某个子集(一个实体将某些东西传递给另一个实体)
– 例如 Sorter 将功能委托给某个 Comparator
§ 明智的委托可实现代码重用
– 排序器可以重复使用任意排序顺序
– 比较器可以与需要的任意客户端代码重用,比较整数
§ 显式委托:将发送对象传递给接收对象
§ 隐式委托:通过语言的成员查找规则
§ 委托可以被描述为一种低级的共享机制,共享实体之间的代码和数据。
建议阅读:
Java委托机制 - enjoin - 博客园 (cnblogs.com)
接口(interface):
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。
除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。
接口特性:
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
抽象类和接口的区别:
- 1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
- 2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
- 4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
(3) Library-level reuse: API/Package
库:一组提供可重用的类和方法 (API) 功能
一个好的 API 的特征:
§ 简单易学
§ 易于使用,即使没有文档
§ 难以滥用
§ 易于阅读和维护使用它的代码
§ 足够强大以满足需求
§ 易于进化
§ 适合受众
(4) System-level reuse: Framework
framework是子系统设计,包含一系列 抽象类和具体类以及每个类之间的接口。开发者根据 framework的规约,填充自己的代码进去,形成完整系统。
框架不同于应用程序:
1.抽象级别是不同的,因为框架提供了一个解决方案 一系列相关的问题,而不是单一的问题。
2.为了容纳问题家族,框架不完整, 结合热点和钩子以允许定制
也就是说框架的抽象级别更高,允许使用框架提供的方法定制以满足需求。
框架可以根据用于扩展的技术进行分类:
白盒框架,通过代码层面的继承进行框架扩展
黑盒框架,通过实现特定接口/delegation进行 框架扩展
参考资料: