可复用性:不针对应用 而是针对多个应用的场景
Programing for/with reuse
1、Programing for reuse 开发可复用的软件
- 开发成本高于一般软件的成本:要有足够高的适应性
- 性能差些:针对更普适场景,缺少足够的针对性
2、Programing with reuse 使用已有软件进行开发
- 可复用软件库,对其进行有效的管理
- 往往无法拿来就用,需要适配
最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用。
1、代码层面:
![](https://i-blog.csdnimg.cn/blog_migrate/a561782ce405f9347d12c401935a4e2f.jpeg)
2、类复用:
- inheritance继承
- delegation委托
3、包复用: API/Package
4、System-level reuse: Framework 框架
- 框架:一组具体类、抽象类、及其之间的连接关系
- 开发者根据framework的规约,填充自己的代码进去,形成完整系统;
- 将framework看作是更大规模的API复用,除了提供可复用的API,还将这些模块之间的关系都确定下来,形成了整体应用的领域复用
- 开发者:增加新代码、对抽象类进行具体化
LSP——Liskov Substitution Principle Liskov替换原则
1、Behavioral subtyping 行为子类型
子类型多态:客户端可用统一的方式处理不同类型的对象
![](https://i-blog.csdnimg.cn/blog_migrate/cd917837afb2f9a2350275c926ce936e.jpeg)
父类型与子类型之间的关系
![](https://i-blog.csdnimg.cn/blog_migrate/d2f855d3a2fc3923c66310ef83fb26c3.jpeg)
2、LSP
![](https://i-blog.csdnimg.cn/blog_migrate/e004da85b6be64948035cc31d86b191c.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/69599763e6cf744c790f12379d65db1d.png)
例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f64d7387a0ac032cf811dcb8a7e4716.jpeg)
协变、反协变
协变:父类型到子类型,由抽象越来越具体。(包括返回值类型,异常的类型)
反协变(逆变):父类型到子类型,由具体越来越抽象。(包括返回值类型,异常的类型)
数组的子类型化
数组是协变的
泛型的子类型化
1、泛型不是协变的
2、类型擦除
类型参数的类型信息在代码编译完成后擦除,就是类型擦除,擦除之后,相当于程序中只有基本的类、接口、方法
![](https://i-blog.csdnimg.cn/blog_migrate/6c9b272c50a5389f6a3d6fa0a9cfdb7d.jpeg)
注意:
![](https://i-blog.csdnimg.cn/blog_migrate/8efcb1b2656ebae7d903ccb5bf039f8d.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/19b5d2fdf756194406d1a8f02207cefa.jpeg)
泛型中的通配符
![](https://i-blog.csdnimg.cn/blog_migrate/8900d3252ebc94e304b1bf5daf98f147.jpeg)
Delegatiion
1、delegation 委派、委托:
一个
对象请求另一个对象的功能
委派是复用的一种常见形式
![](https://i-blog.csdnimg.cn/blog_migrate/56536c1d8a827df763dd6abaf3f417a1.jpeg)
机制:Receiver对象把操作委派给delegate执行,客户端client直接调用receiver而不调用delegate
![](https://i-blog.csdnimg.cn/blog_migrate/896861a2cb201f67b7979b3c053d3495.jpeg)
2、使用委派来扩展功能
![](https://i-blog.csdnimg.cn/blog_migrate/55c633d33aa9a916dac118dbd7e521d0.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/b0e9f11b2debc579b3e683b032ea1409.jpeg)
3、Delegation vs. Inheritance(继承/多态 override 、LSP 、泛型)
![](https://i-blog.csdnimg.cn/blog_migrate/8ff2de501a83dd08d40ee61192fbe98a.jpeg)
Comparator和Comparable
通过接口的组合来实现行为的组合,把不同的组合delegation委派到不同的类
![](https://i-blog.csdnimg.cn/blog_migrate/ec693f61136df76b8a17ad5268eebf91.png)
GRP原则—— Composite Reuse Principle
核心:”委托“发生在objet层面,而“继承”发生在class层面
![](https://i-blog.csdnimg.cn/blog_migrate/79c82fb8f6262fc88e5c891403ab92fa.jpeg)
接口的组合
![](https://i-blog.csdnimg.cn/blog_migrate/ad3c7b7c2821f8e5414de34935df414a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/d1a4d019328f251ecaed9344098d4911.jpeg)
白盒框架的原理与实现
白盒:继承/子类型
子类中由开发者通过override完成父类(abstract)定制的功能
黑盒:delegation
设计模式
几种典型的“面向复用”的设计模式来做更大规模的复用设计。(上一节中讨论的过于“基础”和“细小”。)
adapter适配器模式
将某个类/接口转换为client期望的其他形式
通过增加一个
接口,将已存在的
子类封装起来,clien
t
面向接口编程,从而隐藏了具体子类。
![](https://i-blog.csdnimg.cn/blog_migrate/811969d2dd2eb6c3c12aa448a973a137.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/1137d8ce2bfff8cf9011b931ad867253.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/941c59092cd3ed93bde59c63c9dc6805.jpeg)
Decorator 装饰器模式
功能:为对象增加不同侧面的特性
实现方案:对每一个特性构造
子类,通过
委派机制增加到对象上
![](https://i-blog.csdnimg.cn/blog_migrate/111ea5a8a40e59195d2bebb68d099d60.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2a472837edee416802e55b9ee7cf4b8b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/975d7bea87dba4f8f82b633fe5fc69f5.jpeg)
Facade 外观模式
功能: 客户端需要通过一个简化的接口来访问复杂系统内的功能
实现方案;提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用
![](https://i-blog.csdnimg.cn/blog_migrate/ecc5994cbab4291b8c0b921f58e3699e.jpeg)
Strategy 策略模式
功能:同一个任务有不同的实现方案,客户端可以在执行过程中具体选择哪一种设计方案
实现方法:设计一个接口,不同的实现方案都可以implements这个接口
使用委派delegation模式——黑盒框架设计模式
![](https://i-blog.csdnimg.cn/blog_migrate/206c2c27785759ee0a8ba1dca106a065.jpeg)
例:信用卡支付和支付宝支付都implemnts 接口PaymentStrategy()
![](https://i-blog.csdnimg.cn/blog_migrate/77b91303ee50b2c10073b49d6d2fa1e5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/1732aae0285ee2b08350e07427d54f30.jpeg)
Template 模板模式
适用条件:做事情的步骤一样,但具体方法不同
实现方法;共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现
使用继承和重写实现模板模式——白盒框架
![](https://i-blog.csdnimg.cn/blog_migrate/51712592df57befdd79aec6b7e08ff2a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/87886397a230d56c9c6623189d0fca7b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/da66cdbaae264ac9a917238c8ceb9ca2.jpeg)
Iterator迭代器模式
适用条件:用户需要用一个统一的策略来获得某一容器内的所有元素,而不用管这个容器的类型
实现方案;迭代。让自己的集合类实现Iterable接口,并实现自己的独特Iterator迭代器(hasNext, next,remove),允许客户端利用这个迭代器进行显式或隐式的迭代
![](https://i-blog.csdnimg.cn/blog_migrate/c2da046e8c744917bbf80f4a7bbf5085.jpeg)