【软件构造】第五章知识整理

Programing for/with reuse

面向复用编程:开发出可复用的软件

基于复用编程:利用已有的可复用软件搭建应用系统

***特点:很大的适应性 + 降低成本和开发时间+ 充分的测试(高可靠) + 标准化、一致化 + 针对性不强(性能差)

 

 

 

LSPLiskov Substitution Principle

行为子类型化:更强的不变量 + 更弱的前置条件 + 更弱的后置条件

             子类需与父类含有相同的不变量(或更多)

             重写的方法需与父类中的该方法有相同的前后置条件/更弱的前置条件/更强的后置条件

LSP(强行为子类型化):

①前置条件不能强化

②后置条件不能弱化

③不变量要保持

④子类型方法参数——逆变

⑤子类型方法的返回值——协变

⑥异常类型——协变

 

 

 

逆变、协变

协变:父类型->子类型:越来越具体;

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

反协变:父类型->子类型:越来越具体

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


 

 

 

数组的子类型化

T[]数组中只含有T类型的数组或T的子类型的数组

e.gInteger[] myInts ={1,2,3,4};

    Number[] myNumber = myInts;  ->myNumber只接受Integer

     因此若myNumber[0] = 3.14 会出现编译错误

 

 

 

泛型的子类型化

***ArrayList<String>List<String>的子类

   List<String>不是List<Object>的子类

***类型擦除:T->Object Node<T> -> Node

List<Number> myNumber = new ArrayList<Integer>();//编译错误

 

 

 

泛型中的通配符(?)

***<?super A>:?的类型为A的父类或为A

***<?extends A>:?是A的子类

 

 

 

delegation 委派/委托

***委派/委托:一个对象请求另一个对象的功能

过程:receiver对象将操作委托给Delegate对象同时Receiver对象要确保客户端不会滥用委托对象

***如果子类只需要复用父类中的一小部分方法,可以不需要使用继承,而是通过委派机制来实现

***分类:

Dependency: 临时性的delegation    use-a

  一个类利用另一个类中的实例但不将其作为该类的一个属性

Association: 永久性的delegation    has-a

  允许一个对象实例导致另一个对象执行方法

Composition: 更强的delegation     “is-part-of”

  一种将简单对象或数据类型组合成更复杂的对象的方法

Aggregation

  一个对象在另一个类中存在,在另一个类中创建,并将其作为参数传递给构造者

 

 

 

ComparableComparator

***Comparator:如果你的ADT需要比较大小,或者要放入CollectionsArrays进行排序,可实现Comparator接口并override compare()函数。

e.g int compare(T o1,T o2)

***Comparable:让你的ADT 实现Comparable 接口,然后override compareTo() 方法

***使用Comparable与使用Comparator的区别:不需要构建新的Comparator类,比较代码放在ADT内部。

 

 

 

CRP

***类应该通过其组合(通过包含实现所需功能的其他类的实例)实现多态行为和代码重用,而不是从基类或父类继承

***委托发生在object层面;继承发生在class层面

***使用接口定义不同侧面的行为;接口之间通过extends实现行为的扩展(接口组合);  implements  组合接口

e.g

 

 

 

白盒框架的原理及实现

***通过子类化和重写方法进行扩展

   通用设计模式:Template

   子类中实现主要方法

***白盒框架使用继承方法

e.g

 

 

 

黑盒框架的原理及实现

***通过实现插件接口进行扩展

   常用设计模式:StrategyObserver

***黑盒框架是使用委派方法

 

 

 

设计模式

创建型模式

***Adapter:适配器模式

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

  

***Decorator:装饰器模式

   Problem:为对象增加不同侧面的特性

   Solution:对每一个特性构造子类,通过委派机制增加到对象上


***Facade:外观模式

   Problem:客户端需要通过一个简化的接口来访问复杂系统内的功能

   Solution:提供一个统一的接口来取代一系列小接口调用,相当于对复杂

系统做了一个封装,简化客户端使用,便于客户端学习使用,

行为类模式

***Stategy:策略模式

   Problem:若一个问题存在多种算法解决,client可以自主选择用哪种算法

   Solution:创建一个接口记录算法,该接口有多个具体实现类

***Template:模板模式

   Problem:多个client共用一个算法,但其具体实现方法有所差别

   Solution:共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现,使用继承和重写实现模板模式

***Iterator

   Problemclient使用统一的策略来访问container中的所有元素,与container的类型无关。

   Solution:迭代

  • Iterable接口:实现该接口的集合对象是可迭代遍历的

  • Iterator接口:迭代器

  • Iterator pattern :让自己的集合类实现Iterable 接口,并实现自己的

    独特Iterator 迭代器(hasNext, next, remove) ,允许客户端利用这

    个迭代器进行显式或隐式的迭代遍历:

for(E e : collection) { … }

Iterator<E>iter = collection.iterator();

while(iter.hasNext()){ … }

猜你喜欢

转载自blog.csdn.net/qq_41772794/article/details/80774168