GoF设计模式(十六) - 迭代器模式

Posted 让程序飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoF设计模式(十六) - 迭代器模式相关的知识,希望对你有一定的参考价值。

前言

迭代器模式(Iterator Pattern)提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。该模式属于行为型模式。

模式所涉及的角色

  • 抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方法remove(),
  • 迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
     

代码实现 

迭代器接口

public interface Iterator 
    /**
     * 获取第一元素
     * @return Object
     */
    Object first();

    /**
     * 获取下一个元素
     * @return Object
     */
    Object next();

    /**
     * 是否存在下一个
     * @return Object
     */
    boolean hasNext();

    /**
     * 移除元素
     */
    void remove();

迭代器实现

public class ConcreteIterator implements Iterator

    private List list = new ArrayList();
    private int cursor =0;

    public ConcreteIterator(List list)
        this.list = list;
    

    @Override
    public Object first() 
        return this.list.get(0);
    

    @Override
    public Object next() 
        Object obj = null;
        if(this.hasNext())
            obj = this.list.get(cursor++);
        
        return obj;

    

    @Override
    public boolean hasNext() 
        return cursor != this.list.size();
    

    @Override
    public void remove() 
        if (cursor == 0)
            this.list.remove(cursor);
            return;
        
        this.list.remove(--cursor);
    

 抽象容器

public interface Aggregate 
    /**
     * 添加
     * @param obj Object
     */
    void add(Object obj);

    /**
     * 删除
     * @param obj Object
     */
    void remove(Object obj);

    /**
     * 创建迭代器
     * @return Iterator
     */
    Iterator createIterator();


具体容器

public class ConcreteAggregate implements Aggregate

    private List list = new ArrayList();

    @Override
    public void add(Object obj) 
        list.add(obj);
    

    @Override
    public void remove(Object obj) 
        list.remove(obj);
    

    @Override
    public Iterator createIterator() 
        return new ConcreteIterator(list);
    

    @Override
    public String toString() 
        return Arrays.toString(list.toArray());
    

客户端

@Test
	void contextLoads() 
		Aggregate ag = new ConcreteAggregate();
		ag.add("张三");
		ag.add("李四");
		ag.add("王五");
		Iterator iterator = ag.createIterator();
		while(iterator.hasNext())
			String str = (String)iterator.next();
			System.out.println(str);
		

	

	@Test
	public void contextLoads1()
		Aggregate ag = new ConcreteAggregate();
		ag.add("张三");
		ag.add("李四");
		ag.add("王五");
		Iterator iterator = ag.createIterator();
		while(iterator.hasNext())
			String str = (String)iterator.next();
			if ("王五".equals(str))
				iterator.remove();
			
		
		System.out.println(ag);

	

源码

https://download.csdn.net/download/javanbme/84992832

以上是关于GoF设计模式(十六) - 迭代器模式的主要内容,如果未能解决你的问题,请参考以下文章

GoF设计模式(十六) - 迭代器模式

GOF23设计模式之迭代器模式(iterator)

GoF 23 种设计模式之迭代器模式和命令模式

实践GoF的设计模式:迭代器模式

STL源码分析-iterator(迭代器)

10 迭代器模式