模板方法模式
模板方法的思想是,将共同的子功能提取到超类里面,而仅仅将不同的实现写到子类里面。这个共同的子功能可以相互组合,和不同的子类实现生成不同的组合功能,就叫做模板方法templateMethod();如下图所示
比如茶叶和咖啡的冲泡方法。都是分四步的,如下图所示
其中共同的是把水煮沸和把茶(咖啡)倒进杯子,于是抽象一个父类,将这共同的方法的实现在父类实现。
同时,把沸水冲泡咖啡和用沸水浸泡茶叶是不同的,因此这个作为抽象的方法写进父类。同理,加糖和牛奶以及加柠檬也是不同的。
同时,他们还有一个整合的方法,这个整合方法将这四步整合,这就是父类的模板方法。具体的实现如下所示:
模板方法模式最常见的例子就是java中的排序。通过实现comparable接口或者comparator接口,排序的时候会模板自动调用这个子类的compareTo方法。
迭代器模式
迭代器模式太熟了,直接上类图,过
ConcreteAggregate可以持有一个泛型数组,用这个泛型数组来创建迭代器。最简单就是使用Collection的那些容器类了。
组合模式
讲组合模式之前,先来看一个图片,这个图片是一个餐厅的菜单树状结构。有若干的子餐厅,每个子餐厅又有格子的不同品类的菜单。
对于上述复杂的问题,我们已经不能用迭代器模式去解决了。因为迭代器模式没办法遍历多层次的结构,这个时候就需要用组合模式了。下面是组合模式的类图
这个类图有点像递归,为啥?你看Composite类,它有两种孩子,一个是树叶,一个是Composite。同理,它的孩子Composite也有自己的叶子和Composite。
这其实是是一个从上而下的树形结构。同时这个树形结构也能使用迭代器模式。接下来我们来看如何实现
下面来看具体的实现:
至于组合实现迭代器,这是一个稍微有点好玩的东西。来看看,首先我们在Menu中定义createIterator方法,当然,可以在抽象父类中添加。只不过MenuItem返回一个null,而Menu来实现这个迭代器就行了。
我们来看Menu的createIterator()方法。
然后我们看CompositeIterator的实现。这个里面用了一个栈,这个栈可以接受若干很多的Iterator进来。为什么会需要若干的iteator呢?因为Menu存储的元素可能是Item,也可能还是一个Item,这个时候需要添加新的iterator到里面去。