深入浅出设计模式之模板方法模式、迭代器模式、组合模式

来源:互联网 发布:csi接口 数据通信协议 编辑:程序博客网 时间:2024/06/11 17:07

模板方法模式

模板方法的思想是,将共同的子功能提取到超类里面,而仅仅将不同的实现写到子类里面。这个共同的子功能可以相互组合,和不同的子类实现生成不同的组合功能,就叫做模板方法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到里面去。


0 0
原创粉丝点击