迭代器模式

迭代器模式(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");
	}

	@Override
	public 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 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【编程基础】c语言中获取整数和浮点数的符号位

1. 为什么要获得符号位 很多时候,我们需要判断数值的正负,来做相应的逻辑处理。条件判断语句可以很好的完成这个需求。有时候会有下面的情况, if ...

4358
来自专栏数据科学与人工智能

【Python环境】Python函数式编程指南(1):概述

1. 函数式编程概述 1.1. 什么是函数式编程? 函数式编程使用一系列的函数解决问题。函数仅接受输入并产生输出,不包含任何能影响产生输出的内部状态。任何情况下...

2296
来自专栏angularejs学习篇

js中对arry数组的各种操作小结

  最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以...

2082
来自专栏Java学习网

Java 8的函数式编程学习

Java 8的函数式编程学习 函数式编程语言是什么? 函数式编程语言的核心是它以处理数据的方式处理代码。这意味着函数应该是第一等级(First-class)的...

2667
来自专栏CSDN技术头条

Python编程中的反模式

这篇文章收集了我在Python新手开发者写的代码中所见到的不规范但偶尔又很微妙的问题。本文的目的是为了帮助那些新手开发者渡过写出丑陋的Python代码的阶段。为...

2136
来自专栏noteless

原型模式 prototype 创建型 设计模式(七)

用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象

1092
来自专栏C/C++基础

C++智能指针

C++中,动态内存的管理是通过一对运算符来完成的,new用于申请内存空间,调用对象构造函数初始化对象并返回指向该对象的指针。delete接收一个动态对象的指针,...

2681
来自专栏大内老A

深入理解C# 3.x的新特性(2):Extension Method[上篇]

在C#3.0中,引入了一些列新的特性,比如: Implicitly typed local variable, Extension method,Lambda ...

1916
来自专栏微信公众号:Java团长

JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算

比如6:6/2 = 3 余 0 3 / 2 = 1 余 1 那就是从个位数开始011,读起来就是110了

1771
来自专栏用户2442861的专栏

sizeof小览

http://blog.csdn.net/scythe666/article/details/47012347

821

扫码关注云+社区

领取腾讯云代金券