软件构造 第五章第二节 设计可复用的软件
Posted masteryellow
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件构造 第五章第二节 设计可复用的软件相关的知识,希望对你有一定的参考价值。
第五章第二节 设计可复用的软件
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 ;
- 插件加载机制加载插件并对框架进行控制。
以上是关于软件构造 第五章第二节 设计可复用的软件的主要内容,如果未能解决你的问题,请参考以下文章