迭代器模式
来源:互联网 发布:网络销售产品的价格 编辑:程序博客网 时间:2024/06/01 12:55
迭代器模式(Iterator): 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
用途:在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方法。
举个例子:
Iterator it = list.iterator(); while(it.hasNext()){ //do some businesss logic}迭代器模式角色组成:
1) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
2) 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
3) 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。
4) 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口。
UML图
由上图可知,在客户与容器之间加入了迭代器角色,就可以很好的避免容器内部细节的暴露,从而达到“单一职责原则”的目的。
注意,在迭代器模式中,具体迭代器角色和具体容器角色是耦合在一起的——遍历算法是与容器的内部细节紧密相关的。为了使客户程序从与具体迭代器角色耦合的困境中脱离出来,避免具体迭代器角色的更换给客户程序带来的修改,迭代器模式抽象了具体迭代器角色,使得客户程序更具一般性和重用性。这被称为多态迭代。
来看一个Java例子:
package cn.java.iterator;public class Item {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;} }
Iterator接口:package cn.java.iterator;public interface Iterator { Item first(); Item next(); boolean isDone(); Item currentItem();}
Iterator实现类:
package cn.java.iterator;import java.util.Vector;public class Controller implements Iterator {private int current = 0;private Vector channel;public Controller(Vector v) {channel = v;}public Item first() {current = 0;return (Item) channel.get(current);}public Item next() {current++;return (Item) channel.get(current);}public Item currentItem() {return (Item) channel.get(current);}public boolean isDone() {return current >= channel.size() - 1;}}
Aggregat 接口
package cn.java.iterator;public interface Aggregat { Iterator createIterator();}
实现类:
package cn.java.iterator;import java.util.Vector;public class ConcreteAggregat implements Aggregat {private Vector vector = null;public Vector getVector() {return vector;}public void setVector(final Vector vector) {this.vector = vector;}public ConcreteAggregat() {vector = new Vector();vector.add("vector 1");vector.add("vector 2");}@Overridepublic Iterator createIterator() {return new Controller(vector);}}
测试类:
package cn.java.iterator;public class IteratorClient {public static void main(String[] args) {final Aggregat agg = new ConcreteAggregat();final Iterator iterator = agg.createIterator();System.out.println(iterator.first());while (!iterator.isDone()) {System.out.println(iterator.next());}}}
从上面的示例中就可以看出,尽管我们没有显示的引用迭代器,但实质还是通过迭代器来遍历的。迭代器模式就是分离了集合对象的迭代行为,抽象出一个迭代器类来负责,这样既可做到不暴露集合的内部结构,又可以让外部代码可以透明的访问集合内部的元素。现在的高级语言都对迭代器做了一定的封装,就像文章开始用迭代器来循环遍历。
0 0
- 行为模式-迭代器模式
- 设计模式-迭代器模式
- 设计模式 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 【设计模式】迭代器模式
- 设计模式-迭代器模式
- 设计模式- 迭代器模式
- 设计模式 - 迭代器模式
- 设计模式:迭代器模式
- 行为模式-迭代器模式
- 设计模式 - 迭代器模式
- 设计模式-迭代器模式
- 设计模式--迭代器模式
- 设计模式---迭代器模式
- 设计模式---迭代器模式
- 【设计模式】迭代器模式
- 设计模式 迭代器模式
- 数码管的消影
- UCOS2系统内核讲述(二)_初始化调用函数
- 205. Isomorphic Strings
- 【Leetcode】378. Kth Smallest Element in a Sorted Matrix
- Linux运维笔记----如何获取帮助
- 迭代器模式
- 使用Nodejs 连接数据库实现增删改查功能库
- fragment和fragment传参
- 重叠IO C++
- android6.0 Activity(四) Surface创建
- Python的zip函数
- awk命令
- 继承和多态
- java方法重载和方法覆盖