07 软件复用机制
软件复用机制
最常用的软件复用机制:
- 组合
- 继承
如果A类有一个B类,那么自然地,B类的数据字段也应该是一个A类实例的一部分。另一方面,如果A类是一个B类,那么使用继承是正确的编码方式。
组合:提供了一种利用已存在的软件组件来创建新的应用程序的方法。
组合
- 组合是一种通过创建一个组合了其他对象的类来获得新功能的软件重用方法。(描述的是类之间的HAS-A关系)
例如:一个汽车的属性中包含了车轮类的对象。
继承
- 通过继承,新的类可以声明为已存在类的子类。通过这种方式,与初始类相关的所有数据字段和函数都自动地与新的数据抽象建立联系。
- 继承允许进行高级别算法细节的封装
- 还允许在不改变原始代码的情况下修改或特化这些细节。
继承与组合的比较
-
继承描述的是一种一般性和特殊性的关系,使用继承可创建已存在类的特殊版本。
-
组合描述的是一种组成关系,使用组合可用已存在的类组装新的类。
-
继承和组合是两种重要的软件重用方法。
-
类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用。
-
对象持有(其实就是组合)的整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可见的,故称为黑盒复用。
动态与静态的复用
- 继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。
- 组合中类之间的关系是在运行时候才确定的,即在对象没有创建运行前,整体类是不会知道自己将持有特定接口下的哪个实现类。在扩展方面组合比集成更具有广泛性。
- 封装性:
- 继承中父类定义了子类的部分实现,而子类中又会重写这些实现,修改父类的实现,设计模式中认为这是一种破坏了父类的封装性的表现。这个结构导致结果是父类实现的任何变化,必然导致子类的改变。
- 组合有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。这样类的层次结构不会扩大,一般不会出现不可控的庞然大类。而类的继承就可能出现这些问题,所以一般编码规范都要求类的层次结构不要超过3层。组合是大型系统软件实现即插即用时的首选方式。

框架
- 对于一类相似问题的骨架解决方案。
- 通过类的集合形成,类之间紧密结合,共同实现对问题的可复用解决方案
- 继承和改写的强大能力体现
- 最常见的框架
Java中的GUI框架
Web开发中的Struts框架
复用和特化
使用继承的两种方式:
- 继承:
- 基本方法,对问题的现存的解决方案。将代码抽象从一个项目带到另外一个项目
- 那些继承自父类的方法,这体现了对父类所提供的代码的复用
- 改写:
-
特化方法,用于特定应用的解决方案。为了适合于子类的特定环境,改变了其在父类中的行为。这些方法通常都是延迟的方法
-
那些定义于父类但在子类中实现的方法
-
由于框架必须确保一个类的所有实例都对相关的信息作出合适的响应,因此延迟方法做为父类定义的一部分
-
框架需要的不只是一个类,一个框架通常是由大量的可以协同工作的类组成的
-
如在GUI框架中,存在着许多对应于图形元素的类
倒置库
- 框架改变了应用程序(开发者定义的代码)与库代码之间的关系
传统的应用程序中
应用程序特定的代码定义了程序执行的总体流程
在框架中
控制流是由框架决定的,并且随应用程序的不同而不同
- 新的应用程序的创建者只需改变供框架调用的例程即可,而无需改变总体结构
- 框架占主导地位,而应用程序特定的代码处于次要位置.
预言变化
面向对象设计艺术
- 为应用程序预言将来可能发生的变化,并对应用程序进行相应的设计
- 做到这点不容易
- 需要程序员认识到可以通过类似于以前解决问题的方式或者现存软件系统的方式来解决新问题时,才能够将该问题泛化,使其适合于更广泛的应用程序
- 像C++,需要程序员区分哪些方法可以改写,以及哪些方法不能改写,这种方式过于僵硬了
- 由于程序员在最初无法预言改写某个方法的需求
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91492 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!