深入浅出设计模式之模板方法模式迭代器模式组合模式
Posted 软件猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出设计模式之模板方法模式迭代器模式组合模式相关的知识,希望对你有一定的参考价值。
模板方法模式
模板方法的思想是,将共同的子功能提取到超类里面,而仅仅将不同的实现写到子类里面。这个共同的子功能可以相互组合,和不同的子类实现生成不同的组合功能,就叫做模板方法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到里面去。
以上是关于深入浅出设计模式之模板方法模式迭代器模式组合模式的主要内容,如果未能解决你的问题,请参考以下文章