迭代模式
标签:设计模式

迭代模式(Iterator)

迭代模式是行为模式之一,他把对容器中包含的内部对象的访问委让给外部类使用Iterator按顺序进行遍历访问的设计模式。

不使用迭代模式存在的问题:

  1. 由容器自己实现顺序遍历。直接在容器类里直接添加顺序遍历方法。(容器类承担了太多功能:一方面需要提供添加删除等本身应有的功能;一方面还需要提供遍历访问功能)
  2. 让调用者自己实现遍历。直接暴露数据细节给外部。(往往容器在遍历的过程中,需要保存遍历状态,当跟元素的添加删除等功能夹在一起,很容易引起混乱和程序运行错误)

Iterator模式就是为了有效地处理按顺序进行遍历访问的一种设计模式,简单的说,Iterator模式提供一种有效的方法,可以屏蔽聚集对象集合的容器类的实现细节,而能对容器内包含的对象元素按顺序进行有效的遍历访问。

所以,Iterator模式的应用场景可以归纳为满足以下几个条件:

  • 访问容器中包含的内部对象
  • 按顺序访问

1. 迭代模式中的角色及其职责

1.1 Iterator(迭代器接口)

该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法

我这里用的用的就是Java自带的 java.util.Iterator

1.2 Concrete Iterator(迭代器实现类)

迭代器接口Iterator的实现类,可以根据具体情况加以实现

我这里用的一个内部类放在容器实现类的里面:

private class Itr implements Iterator {

    @Override
    public boolean hasNext() {
        if (index >= personList.size()){
            return false;
        }else {
            return true;
        }
    }

    @Override
    public Object next() {
        return personList.get(index++);
    }

    @Override
    public void remove() {

    }
}

1.3 Aggregate (容器接口)

定义基本功能以及提供类似Iterator iterator()的方法

PersonList

package com.liuyao;

import java.util.Iterator;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public interface PersonList {
    public void addPerson(Person person);

    public void delPerson(Person person);

    public Iterator iterator();
}

1.4 Concrete Aggregate(容器实现类)

容器接口的实现类,必须实现Iterator iterator()方法

PersonListImpl

package com.liuyao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class PersonListImpl implements PersonList{
    private List<Person> personList;
    private int index;

    public PersonListImpl() {
        personList=new ArrayList<>();
    }

    @Override
    public void addPerson(Person person){
        personList.add(person);
    }

    @Override
    public void delPerson(Person person){
        personList.remove(person);
    }

    @Override
    public Iterator iterator(){
        return new Itr();
    }

    private class Itr implements Iterator {

        @Override
        public boolean hasNext() {
            if (index >= personList.size()){
                return false;
            }else {
                return true;
            }
        }

        @Override
        public Object next() {
            return personList.get(index++);
        }

        @Override
        public void remove() {

        }
    }
}


Main

package com.liuyao;

import java.util.Iterator;

public class Main {

    public static void main(String[] args) {
        PersonList personList=new PersonListImpl();
        Person person1=new Person("aaa",12);
        Person person2=new Person("bbb",14);
        Person person3=new Person("ccc",16);
        personList.addPerson(person1);
        personList.addPerson(person2);
        personList.addPerson(person3);

        Iterator iterator=personList.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}


//Person{name='aaa', age=12}
//Person{name='bbb', age=14}
//Person{name='ccc', age=16}

2. 迭代模式的优点

  1. 实现功能分离,简化容器接口。让容器只实现本身的基本功能,把迭代功能委让给外部类实现,符合类的设计原则。
  2. 隐藏容器的实现细节。
  3. 为容器或其子容器提供了一个统一接口,一个方面方便调用;另一个方面使得调用者不必关注迭代器的实现细节。
  4. 可以为容器或其子容器实现不同的迭代方法或多个迭代方法。
  • 4 min read

CONTRIBUTORS


  • 4 min read