软件构造 第五章第二节 设计可复用的软件

第五章第二节  设计可复用的软件

1.LSP

-Subtypes can add, but not remove methods 子类型可以增加方法,但不可删

– Concrete class must implement all undefined methods 子类型需要实现抽象

类型中的所有未实现方法

– Overriding method must return same type or subtype 子类型中重写的方法

必须有相同或子类型的返回值

– Overriding method must accept the same parameter types 子类型中重写的

方法必须使用同样类型的参数

– Overriding method may not throw additional exceptions 子类型中重写的方

法不能抛出额外的异常

 

– Same or stronger invariants 更强的不变量

– Same or weaker preconditions 更弱的前置条件

– Same or stronger postconditions 更强的后置条件

 

强行为子类型化

 

协变:

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

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

异常的类型:也是如此

 

反协变

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

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

 

2.数组是协变的

 

3、泛型中的LSP

使用通配符"?"

 

  • 泛型是类型不变的(泛型不是协变的)。举例来说 
    • ArrayList<String> List<String>的子类型 
    • List<String>不是List<Object>的子类型
  • 在代码的编译完成之后,泛型的类型信息就会被编译器擦除。因此,这些类型信息并不能在运行阶段时被获得。这一过程称之为类型擦除(type erasure)。
  • 类型擦除的详细定义:如果类型参数没有限制,则用它们的边界或Object来替换泛型类型中的所有类型参数。因此,产生的字节码只包含普通的类、接口和方法。
  • 类型擦除的结果: <T>被擦除 T变成了Object

 

4. Delegation and Composition

如果要用Collections.sort()

 

 

方法一:继承comopartor

Override:int compare(T o1, T o2)

 

方法二:实现comparable

写ompareTo()函数

 

复合继承原则(CRP

  • 复合复用原则(CRP):类应当通过它们之间的组合(通过包含其它类的实例来实现期望的功能)达到多态表现和代码复用,而不仅仅是从基础类或父类继承。 
  • 我们可以将组合(Composition)理解为(has a)而继承理解为(is a)
  • 例子:

 

 

 

四种deletion方式:

  • 临时性委派(Dependency):最简单的方法,调用类里的方法(use a),其中一个类使用另一个类而不实际地将其作为属性。
  • 永久性委派(Association):类之中有其它类的具体实例来作为一个变量(has a
  • 更强的委派,组合(Composition):更强的委派。将一些简单的对象组合成一个更为复杂的对象。(is part of
  • 聚合(Aggregation:对象是在类的外部生成的,然后作为一个参数传入到类的内部构造器。(has a)

 

框架:

框架分为白盒框架和黑盒框架。 

  • 白盒框架: 
    • 通过子类化和重写方法进行扩展(使用继承); 
    • 通用设计模式:模板方法; 
    • 子类具有主要方法但对框架进行控制。
  • 黑盒框架: 
    • 通过实现插件接口进行扩展(使用组合/委派); 
    • 常用设计模式:Strategy, Observer  
    • 插件加载机制加载插件并对框架进行控制。

猜你喜欢

转载自www.cnblogs.com/masteryellow/p/9214312.html