遍历——迭代器模式

迭代器模式

​ Iterator Pattern:迭代器模式,是GoF23种设计模式中属于行为型模式的一种。

​ 迭代器的模式已经是很多高级编程语言中常用的设计模式了,体现的位置也是方方面面都可以,比如最常用的for循环就是如此。

​ 在JAVA中,有增强for循环,使用到的就是迭代器模式

for(Demo demo : demos){
    // TODO
}

​ 在Python中,有着for in 的循环语句也是迭代器模式的体现

for demo in demos:
    pass

​ 在.NET中,有着IEumerator支持对非泛型集合的简单迭代接口。

结构

迭代器模式
​ 结合类图简单分析一下,迭代器对象分为四个角色,也可以说其实只有两个角色:

  1. 聚合对象:也就是被迭代的对象,这是一个抽象类,用于程序的后序扩展
  2. 迭代器对象:这是迭代器抽象类或者接口,定义如何得到聚合对象的第一个对象,如何得到下一个对象,如何判断是否已经到达结尾等等统一的行为抽象方法。
  3. 具体聚合对象:也就是实现了聚合对象的实体类
  4. 具体的迭代器:实现迭代器,并且对指定的具体聚合对象做定制化的操作。
举例
  1. Java语言中有着iterator就是迭代器模式的体现。
  2. 多个语言中的for循环也有迭代器的体现。
注意
  • 迭代器模式可以按照一个顺序访问聚合对象中的各个元素,而且不需要向用户展示聚合对象的具体实现细节。
  • 迭代器模式可以提供多个不同的方向访问聚合对象中的各个元素,给遍历元素带来多样化的遍历方式。也就是说,一个聚合对象上面可以有多个不同的遍历方式。
一个小DEMO
  1. 场景

    迭代器模式说简单点就是提供一个访问的顺序的方式,而且不需要了解对象的内部细节,每个对象的访问都是统一的操作。

  2. 迭代器接口

    /**
     * 迭代器模式——迭代器抽象类/接口
     * @author wq
     */
    public interface Iterator {
    	// 得到下一个对象
    	Object next();
    	// 判断是否到达结尾,也就是还有没有下一个
    	boolean hasNext();
    }
    
  3. 聚合对象抽象

    /**
     * 迭代器模式——聚合对象抽象类/接口
     * @author wq
     */
    public interface Aggregate {
    	// 得到迭代器
    	Iterator getIterator();
    }
    
  4. 常见的内部类实现迭代器的方式,这里以数组为例子,也可以是List,Set,Map都行

    /**
     * 迭代器模式——具体的聚合对象  具体的迭代器对象
     * 通过内部类的方式实现,也是常见的实现方式
     * @author wq
     */
    public class MyAggregate implements Aggregate{
    	public String[] demo = {"a","b","c","d","e"};
    
    	@Override
    	public Iterator getIterator() {
    		return new MyIterator();
    	}
    	
    	private class MyIterator implements Iterator{
    		// 当前访问的对象下标
    		int current = 0;
    
    		@Override
    		public Object next() {
    			if (this.hasNext()) {
    				return demo[current++];
    			}
    			return null;
    		}
            
    		@Override
    		public boolean hasNext() {
    			return current < demo.length ? true : false;
    		}
    	}
    }
    
  5. 测试类

    /**
     * 迭代器模式——测试类
     * @author wq
     */
    public class Main {
    	public static void main(String[] args) {
    		MyAggregate myAggregate = new MyAggregate();
    		for (Iterator iterator = myAggregate.getIterator(); iterator.hasNext();) {
    			System.out.println("-->" + iterator.next());
    		}
    	}
    }
    
  6. 走一波

    -->a
    -->b
    -->c
    -->d
    -->e
    

完成!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值