复用类型:
白盒复用:源码可见,可修改和扩展
黑盒复用: 源码不可见,不能修改,只能通过API接口使用
一。代码层面的复用
copy--paste
二。模型层面的复用(class and interface)
类复用
- 继承 inheritance
- 委托 delegation
库复用(一系列方法APIs) 用户主导
- API
- Package
系统级别的复用Framework复用 框架主导
框架:一组具体类,抽象类以及之间的连接关系,只有骨架没有血肉
开发者根据framework的规约,填充自己的代码进去,形成完整的系统
三。委托介绍
子类只需要复用父类的一小部分方法,可以不使用继承,而是通过委托的机制来实现,从而避免继承大量无用的方法
Composite Reuse Principle(CRP) 组合复用原则,具体体现在委托中
一个object和另一个object的关系 has_a , use_a , is_a
委托的类型
1.依赖Dependency(use_a)
临时性的delegation
(UML 表示 ------>)
class Duck{ void fly(Flyable f){ f.fly(); } }
在被委托类中没有属性存储委托的对象,将其放置在方法的参数列表中
2.关联Association
永久性的delegation(has_a)
UML表示:单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联(委托)类
public class Duck { Flyable f = new CannotFly(); public Duck(Flyable f) { this.f = f; } void Duck() { f = new FlyWithWings(); } void fly() { f.fly(); } }
在类构造对象的时候表明委托谁来做
3.Composition(is_part_of) 更强的Association,但难以变化
UML实心菱形在被委托的一方,然后使用实线连接
public class Duck { Flyable f = new FlyWithWings(); void fly() { f.fly(); } }
要委托的对象在类中直接确定好,不可改变
4.Aggregation(更弱的association),可动态变化
UML表示 空心菱形在被委托的一方,然后使用实线连接
提供了一个set方法进行修改
public class Duck { Flyable f = new FlyWithWings(); //构造器 public Duck(Flyable f) { this.f = f; } void fly() { f.fly(); } //set void setFlyBehavior(Flyable f) { this.f = f; } }