摘要:
白盒复用,黑盒复用
白盒框架(继承),黑盒框架(委托)
委托的种类及其区别
面向复用编程
可重用的外部表现(类型重用(泛型)以及实现重用(接口和抽象类))
面向复用编程
主要有以下几种复用:
代码级别复用:method
模块级别复用:class,interface
Library级别的复用:API
系统级别的复用:框架
白盒复用:
代码本身可知,通常需要某种修改或改编
黑盒复用:
通过提供一些“粘合剂”以现有代码的形式重用,但无需更改代码本身
- 通常是因为您无法访问代码
继承和委托是两种复用的基本机制,白盒复用基于继承,黑盒复用基于委托。
继承:
Java提供了继承已有类的属性和方法的操作,另外,还可以重写已有的行为
委托(delegation)
委托只是当一个对象依赖于另一个对象来实现其功能的某个子集时
委托的种类:
Association描述的是类与类之间一般的关联关系,而Aggregation和Composition都有整体和部分的关系。其中Aggregation中的部分脱离了整体,部分仍然有意义,是共享式的。而Composition中的部分脱离了整体,部分将没有任何意义,是独占式的。
从实现的角度上讲:
三者中以属性出现时,有着不同的实现方法。其中Association中作为属性出现时,不需要对其进行强制赋值,只要在使用时对其进行初始化即可(让它打球的时候getball)。Aggregation中作为属性出现时,需要在构造器中通过传递参数来对其进行初始化(A委托B,构造A的时候传入一个B就行),也就是说,B脱离了A仍旧有意义。Composition作为属性出现时,需要在整体的构造器中创建部分的具体实例(A委托B,需要在构造A的时候给出B的具体参数去new B),完成对其的实例化,独占式,离开A,B没有任何意义。
组合是整体的一部分,不可分。聚合彼此可分。
正如之前所说,在聚合时,只需传入一个B对A进行实例化,而在组合时,要传入B的各项参数对B进行实例化,进而对A进行实例化,原因就是B是A的一部分。依赖关系更强。
框架可分为黑盒框架和白盒框架
白盒框架用继承实现,知道具体实现
黑盒框架用委托实现,不需要知道具体实现
可重用性的外部表现
类型可变:通常通过泛型实现。
实现可变:ADT有多种不同的实现,提供不同的representations和 abstract funtion,但具有同样的specification (pre-condition, postcondition, invariants),从而可以适应不同的应用场景。
功能分组:提供完备的细粒度操作,保证功能的完整性,不同场景下复用不同的操作(及其组合)。
表示独立:内部实现可能会经常变化,但客户端不应受到影响,或者说信息隐藏。
共性抽取:将共同的行为(共性)抽象出来,形成可复用实体。