Template method pattern
从这个模式的名字就可以知道个大概,Template说明这个模式有一个模版,子类都要按照父类列出的大纲来干活。在这个模式中,父类通常是abstract的。为什么不用接口?因为对某些所有子类都要用到的方法,父类中就给出了代码,而接口中是不能有具体实现代码的。
父类中有一个总的方法就是所谓的template method,这个方法通常被声明为final,这样子类就无法override它,保证了它的权威性。这个template method调用其它方法,这些“其它方法”包括了三个类型:
第一种,是abstract类型,子类需要根据自己的情况实现这部分代码;
第二种,是final型的,这种方法父类把它写死了,子类必须遵守;
第三种,就是普通方法,是optional的,子类可以延用父类的方法,也可以override掉它,写自己的代码,这种optional的方法给它一个名字叫做hook。
这个父类通常是这种形势。
abstract class AbstractClass{
final void templateMethod(){
a();
b();
c();
…
}
abstract void a();
final void b(){}
void c(){}
}
应该说这个模式既蕴含着权威性和自由性。
Iterator and Composite Patterns
这个模式的研究对象是Collection,包括ArrayList、Array甚至还有Hashmap等等一切java里面的集合对象。Iterator的理念是把集合对象中的遍历等功能独立抽取出来,实现一个Iterator的接口,主要实现next()和hasNext()两个方法,这些东西和数据结构里面的东西基本一样。
而以此为基础的Composite Pattern其实就是数据结构里面树的概念,所以这里的东西还是找本数据结构书看看更好。
The State Pattern
初看这个模式,发现里面有一个类似UML中状态图的东西,如其名字,这个模式主要描述如何处理应用中出现的“状态”。
解决方式是这样的:
. 第一步,创建一个叫做State的接口,里面包含什么东西呢?记得UML状态图中发生状态转换时箭头上面那些改变的条件?把这些条件全部转化为方法,表示当这个条件发生时,状态该怎么变。
第二步,每个具体的concreteState都要实现都要实现State这个接口。怎么实现?当然,state不是独立出现的,总有一个把它作为参数的类,里面有个私有变量保存当前的状态,暂且就把它称作currentState吧。接口中定义的方法,在concreteState中这样实现:每个方法根据条件定义,将currentState改成相应的状态。
以上其实就是State Pattern的精髓。