复习知识点中主要包含了以下几个设计模式:adapter、decorator、strategy、template、iterator/iterable、factory method、visitor。
1、Factory Method Pattern
定义一个接口,让子类决定实例化到哪个类:一个interface,你一种implement,我一种implement,主函数里new时自己选。
Trace log1 = new SystemTrace();
Trace log2 = new FileTrace();
log1来自system,log2来自file,log1和log2都有美好的未来!
2、Adapter Pattern
将某个类/接口转换为client期望的其他形式。
当interface中参数形式与client不一致的时候,先另外写一个与client形式一致的class,再在implement中调用它,悄悄地转换成一致的!如下图所示:
3、Decorator Pattern:组合叠加特性
在interface定义基础的功能,ArrayStack中实现基础的功能(是一个abstract class),各种implement继承这个abstract class以实现其他的花里胡哨的功能。在client中实现一个普通的class,再一层一层地往上套特性即可。如下图所示:
4、Strategy Pattern:多种可选算法执行同一个任务
interface中定义一个算法类(它的名字就是关于“算法类”,提示implement继承它),分不同的implement使用不同的算法进行继承,在client方法中作参数。如下图所示:
5、Template Method Pattern 模板模式
通俗地讲,就是你们都需要完成同样的几件事儿,但是除了事项以外,你们的实现是截然不同的,比如兰博基尼和奥拓都有门、发动机、座椅,但是它们的实现是不同的。
因此,你只需要在interface中定义出这些“事项”,然后在implement里分别实现,就相当于interface提供了一个模板,实现只是在使用这个模板。
6、Iterator Pattern
客户端希望对放入容器/集合类的一组ADT对象进行遍历访问,而无需关心容器的具体类型。也就是说,不管对象被放进哪里,都应该提供同样的遍历方式。
具体的实现步骤是:用Collection interface继承Iterable interface,再用自己的实现完成Collection和Iterable中的Iterator。最终要实现Iterator中的三个方法:boolean hasNext(); E next(); void remove(); 。如下图所示:
7、Visitor Pattern
对特定类型object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类。本质上:就是将数据和作用于数据上的某种/些特定操作分离开来。为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下在需要时通过delegation接入ADT。