软件可复用性

软件可复用性

软件复用是使用现有软件组件实现或更新软件系统的过程。

两种基于软件可复用性实现:

  1. 面向复用编程:开发出可复用的软件
  2. 基于复用编程:利用已有的可复用软件搭建应用系统

软件可复用性流程:
设计出可复用性的软件-利用设计的可复用的软件进行应用开发

面向复用编程:
构建可复用的软件,实现复杂
分析各个实现的基本共性操作,实现共性操作

基于复用编程:
根据具体实现利用已实现的可复用软件实现自己的具体实现

面向复用的软件构造技术

1. 继承与重写 ( 行为子类型 Liskov替换原则 )

继承就是子类继承父类
继承要满足行为子类型和 Liskov替换原则
行为子类型: 就是子类继承父类,父类的行为子类一定要实现
在可以使用父类的场景,都可以用子类代替而不会有任何问题

  1. 子类型可以增加方法,但不可删
  2. 子类型需要实现抽象类型中的所有未实现方法
  3. 子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
  4. 子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
  5. 子类型中重写的方法不能抛出额外的异常
    (可静态检测)

继承子类拥有

  1. 更强的不变量
  2. 更弱的前置条件
  3. 更强的后置条件
    (不可静态检测)

特别注意:

   ArrayList<String> is a subtype of List<String> 
   List<String> is not a subtype of List<Object>

List的类型擦除 运行时List内部成员变量类型都是Object
List只能赋值给相同类型List引用,否则编译出错

Liskov Substitution Principle (LSP):
前置条件不能强化
后置条件不能弱化
不变量要保持
子类型方法参数:逆变
父类型->子类型:
越来越具体的specific
返回值类型:不变或变得更具体

子类型方法的返回值:协变
父类型->子类型:
越来越具体specific
返回值类型:不变或变得更具体
异常的类型:不变或变得更具体

2. 重载

方法名相同,参数不同

3. 参数多态与泛型编程

因List类型擦除,引出了泛型
List<?> ————这是一个未知类型的列表 <? super A>接收A的父类 <? extends A> 接收A的子类

 List<Number> is a subtypeof List<?>
 List<Number> is a subtypeof List<? extends Object> 
 List<Object> is a subtypeof List<? super String>

4. 组合与委托

将功能实现利用接口抛出去,利用别的类实现具体功能
不同的接口定义不同的功能
通过接口组合完成各种操作实现

将接口作为该类的一个属性,使用接口属性使用功能(委托)

面向复用的设计模式

1. 创建型模式

工厂方法模式

当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。

定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。

相当于工厂和产品
产品不直接使用产品的构造方法实例,通过工厂提供的方法实例化

抽象工厂模式

提供接口以创建一组相关/相互依赖的对象, 但不需要指明其具体类。

创建的不是一个完整产品,而是“产品族”(遵循 固定搭配规则的多类产品的实例),得到的结果是:多个不同产品的object,各产品创建过程对client可见,但“搭配”不能改变。 
本质上,Abstract Factory是把多类产品的factory method组合在一起

2. 结构型模式

适配器模式(委托实现)

将某个类/接口转换为client期望的其他形式
通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
将已实现的功能通过接口满足client实现

装饰器模式

抽象接口,共性操作
用每个子类实现不同的特性
如果需要特性的任意组合,对每一个特性构造子类,通过委派机制增加到对象上

外观模式

提供一个统一的接口来取代一系列小接口调用,相当于对复杂统做了一个封装,简化客户端使用
各个小接口抛出,具体功能子类实现,外观模式提供统一的接口,根据参数选择不同接口的操作

3. 行为类模式

策略模式(委托实现)

为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例

模板模式

两种实现:

  1. 黑盒框架
    用户不知道内部实现,总体框架已经实现,将需要实现的方法通过接口抛出,子类具体实现,再通过委托传给总体框架
  2. 白盒框架
    直接继承父类,继承重写需要实现的功能

迭代器模式

客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型
Iterator pattern:
让自己的集合类实现Iterable接口,并实现自己的独特Iterator迭代器(hasNext, next, remove),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值