软件构造-5

代码复用

 

复用类型:

  1. 白盒复用:

源代码可见,可修改扩展

可定制化程度高

对其修改增加了软件的复杂度,且需要对其内部充分的了解

  1. 黑盒复用

源代码不可见,不可修改

简单,清晰

适应性差

 

LSP

子类型多态:客户端可用统一的方法处理不同类型的对象

 

Java类:

子类型可以增加方法,但不可删

子类型需要实现抽象类型中的所有未实现方法

子类型中重写的方法必须有相同或子类型的返回值

子类型中重写的方法必须使用同样类型的参数

子类型中重写的方法不能抛出额外的异常

 

LSP:

前置条件不能强化

后置条件不能弱化

不变量要保持

子类型方法参数:逆变

子类型方法的返回值:协变

异常类型:协变

 

协变,反协变:

 

Covariance (协变):

父类型->子类型:越来越具体specific 。

返回值类型:不变或变得更具体 。

异常的类型:也是如此。

Contravariance (反协变、逆变):

父类型->子类型:越来越具体specific 。

参数类型:要相反的变化,要不变或越来越抽象。

 

泛型的子类型化

 

编译完成后,编译器会丢弃类型参数的类型信息; 因此这种类型的信息在运行时不可用。这个过程称为类型擦除( type erasure),因此泛型不是协变的

类型擦除:如果类型参数是无界的,则将泛型类型中的所有类型参数替换为它们的边界或对象。 因此,生成的字节码只包含普通的类,接口和方法。

 

 

泛型中的通配符:

无界通配符类型使用通配符(?)指定,例如List <?>,这被称为未知类型的列表。

在两种情况下,无界通配符是一种有用的方法:

(1)如果您正在编写可使用Object类中提供的功能实现的方法。

(2)当代码使用泛型类中不依赖于类型参数的方法时。 例如,List.size或List.clear。 事实上,Class <?>经常被使用,因为Class <T>中的大多数方法不依赖于T。

 

委派:

一个对象请求另一个对象的功能

委派是复用的一种常见形式。

分为显性委派:将发送对象传递给接收对象;

隐性委派:由语言的成员查找规则

 

委派和继承的不同

继承:通过新操作扩展基类或覆盖操作。

委托:捕获操作并将其发送给另一个对象

 

复合继承原则

类应该通过其组合(通过包含实现所需功能的其他类的实例)实现多态行为和代码重用,而

不是从基类或父类继承

 

委派的类别

1. Dependency: 临时性的delegation

2. Association: 永久性的delegation

3. Composition: 更强的delegation

4. Aggregation

 

框架:

白盒框架:

  1. 通过子类化和重写方法进行扩展(使用继承);
  2. 通用设计模式:模板方法;
  3. 子类具有主要方法但对框架进行控制。
  4. 允许扩展每一个非私有方法
  5. 需要理解父类的实现
  6. 一次只进行一次扩展
  7. 通常被认为是开发者框架

黑盒框架

  1. 通过实现插件接口进行扩展(使用组合/委派);
  2. 常用设计模式:Strategy, Observer ;
  3. 插件加载机制加载插件并对框架进行控制。
  4. 允许在接口中对public方法扩展
  5. 只需要理解接口
  6. 通常提供更多的模块
  7. 通常被认为是终端用户框架,平台

 

设计模式

适配器模式

装饰器模式

外观模式

策略类模式

模板模式

迭代器模式

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值