zoukankan      html  css  js  c++  java
  • 迭代器模式

    个人博客

    http://www.milovetingting.cn

    迭代器模式

    模式介绍

    迭代器模式又称为游标(Cursor)模式,是行为型设计模式之一。

    模式定义

    提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示。

    使用场景

    遍历一个容器对象时。

    简单使用

    定义迭代器接口

    /**
     * 迭代器接口
     * 
     * @author 160317250
     *
     * @param <T>
     */
    public interface Iterator<T> {
    	/**
    	 * 是否还有下一个元素
    	 * 
    	 * @return
    	 */
    	boolean hasNext();
    
    	/**
    	 * 返回当前位置的元素并将位置移至下一位
    	 * 
    	 * @return
    	 */
    	T next();
    }
    

    定义迭代器实现类

    /**
     * 具体迭代器类
     * @author 160317250
     *
     * @param <T>
     */
    public class IteratorImpl<T> implements Iterator<T> {
    
    	private List<T> list = new ArrayList<T>();
    	private int cursor = 0;
    
    	public IteratorImpl(List<T> list) {
    		this.list = list;
    	}
    
    	@Override
    	public boolean hasNext() {
    		return cursor != list.size();
    	}
    
    	@Override
    	public T next() {
    		T obj = null;
    		if (this.hasNext()) {
    			obj = this.list.get(cursor++);
    		}
    		return obj;
    	}
    
    }
    

    定义容器接口

    /**
     * 容器接口
     * 
     * @author 160317250
     *
     */
    public interface Container<T> {
    	/**
    	 * 添加一个元素
    	 * 
    	 * @param obj
    	 */
    	void add(T obj);
    
    	/**
    	 * 移除一个元素
    	 * 
    	 * @param obj
    	 */
    	void remove(T obj);
    
    	/**
    	 * 获取容器的迭代器
    	 * 
    	 * @return
    	 */
    	Iterator<T> iterator();
    }
    

    定义容器实现类

    public class ContainerImpl<T> implements Container<T> {
    
    	private List<T> list = new ArrayList<T>();
    
    	@Override
    	public void add(T obj) {
    		list.add(obj);
    	}
    
    	@Override
    	public void remove(T obj) {
    		list.remove(obj);
    	}
    
    	@Override
    	public Iterator<T> iterator() {
    		return new IteratorImpl<>(list);
    	}
    
    }
    

    调用

    public class Main {
    
    	public static void main(String[] args) {
    		Container<String> container = new ContainerImpl<>();
    		container.add("a");
    		container.add("b");
    		container.add("c");
    		Iterator<String> iterator = container.iterator();
    		while (iterator.hasNext()) {
    			System.out.println(iterator.next());
    		}
    	}
    
    }
    

    输出结果:

    a
    b
    c
    

    小结

    对于迭代器模式来说,其自身优点很明显也很单一,支持以不同的方式去遍历一个容器对象,也可以有多个遍历,弱化了容器类与遍历算法之间的关系,而缺点就是对类文件的增加。

    迭代器模式发展至今,几乎每一种高级语言都有相应的内置实现,对于开发者而言,已经极少自己实现迭代器,因此对于迭代器模式更多的是在于了解。

  • 相关阅读:
    这是阿里技术专家对 SRE 和稳定性保障的理解
    阿里四年技术 TL 的得失总结:如何做好技术 Team Leader
    深度 | 阿里云蒋江伟:什么是真正的云原生?
    亲历者说 | 完整记录一年多考拉海购的云原生之路
    Seata RPC 模块的重构之路
    对容器镜像的思考和讨论
    20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测
    怎么提升写代码的能力
    云原生 DevOps 的 5 步升级路径
    dubbo-go 白话文 | 从零搭建 dubbogo 和 dubbo 的简单用例
  • 原文地址:https://www.cnblogs.com/milovetingting/p/12312373.html
Copyright © 2011-2022 走看看