软件构造第五章 面向可复用性的构造

可复用性:不针对应用 而是针对多个应用的场景
Programing for/with reuse
1、Programing for reuse 开发可复用的软件
  • 开发成本高于一般软件的成本:要有足够高的适应性
  • 性能差些:针对更普适场景,缺少足够的针对性
2、Programing with reuse 使用已有软件进行开发
  • 可复用软件库,对其进行有效的管理
  • 往往无法拿来就用,需要适配

最主要的复用是在代码层面,但软件构造过程中的任何实体都可能被复用。
1、代码层面:

2、类复用:
  • inheritance继承
  • delegation委托
3、包复用: API/Package
4、System-level reuse: Framework 框架
  • 框架:一组具体类、抽象类、及其之间的连接关系
  • 开发者根据framework的规约,填充自己的代码进去,形成完整系统;
  • 将framework看作是更大规模的API复用,除了提供可复用的API,还将这些模块之间的关系都确定下来,形成了整体应用的领域复用
  • 开发者:增加新代码、对抽象类进行具体化

LSP——Liskov Substitution Principle Liskov替换原则
1、Behavioral subtyping 行为子类型
子类型多态:客户端可用统一的方式处理不同类型的对象
父类型与子类型之间的关系

2、LSP

例:


协变、反协变
协变:父类型到子类型,由抽象越来越具体。(包括返回值类型,异常的类型)
反协变(逆变):父类型到子类型,由具体越来越抽象。(包括返回值类型,异常的类型)


数组的子类型化
数组是协变的

泛型的子类型化
1、泛型不是协变的
2、类型擦除
类型参数的类型信息在代码编译完成后擦除,就是类型擦除,擦除之后,相当于程序中只有基本的类、接口、方法

注意:

泛型中的通配符

Delegatiion
1、delegation 委派、委托:
一个 对象请求另一个对象的功能
委派是复用的一种常见形式
机制:Receiver对象把操作委派给delegate执行,客户端client直接调用receiver而不调用delegate

2、使用委派来扩展功能

3、Delegation vs. Inheritance(继承/多态 override 、LSP 、泛型)

Comparator和Comparable
通过接口的组合来实现行为的组合,把不同的组合delegation委派到不同的类

GRP原则—— Composite Reuse Principle
核心:”委托“发生在objet层面,而“继承”发生在class层面

接口的组合


白盒框架的原理与实现
白盒:继承/子类型
子类中由开发者通过override完成父类(abstract)定制的功能

黑盒:delegation


设计模式
几种典型的“面向复用”的设计模式来做更大规模的复用设计。(上一节中讨论的过于“基础”和“细小”。)
adapter适配器模式
将某个类/接口转换为client期望的其他形式
通过增加一个 接口,将已存在的 子类封装起来,clien t 面向接口编程,从而隐藏了具体子类。



Decorator 装饰器模式
功能:为对象增加不同侧面的特性
实现方案:对每一个特性构造 子类,通过 委派机制增加到对象上




Facade 外观模式
功能: 客户端需要通过一个简化的接口来访问复杂系统内的功能
实现方案;提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用

Strategy 策略模式
功能:同一个任务有不同的实现方案,客户端可以在执行过程中具体选择哪一种设计方案
实现方法:设计一个接口,不同的实现方案都可以implements这个接口
使用委派delegation模式——黑盒框架设计模式

例:信用卡支付和支付宝支付都implemnts 接口PaymentStrategy()



Template 模板模式
适用条件:做事情的步骤一样,但具体方法不同
实现方法;共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现
使用继承和重写实现模板模式——白盒框架



Iterator迭代器模式
适用条件:用户需要用一个统一的策略来获得某一容器内的所有元素,而不用管这个容器的类型
实现方案;迭代。让自己的集合类实现Iterable接口,并实现自己的独特Iterator迭代器(hasNext, next,remove),允许客户端利用这个迭代器进行显式或隐式的迭代

猜你喜欢

转载自blog.csdn.net/qq_41406742/article/details/80783486