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

    迭代器模式(Iterator Pattern)是最常被使用的几个模式之一,被广泛地应用到Java的API中。

    定义:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。

    类图如下所示。

     

     迭代器模式有以下4个角色。

    • 抽象迭代器(Iterator)角色:负责定义访问和遍历元素的接口。
    • 具体迭代器(Concrete Iterator)角色:实现Iterator接口,完成容器元素的遍历。
    • 抽象聚集(Aggregate)角色:提供创建迭代器角色的接口。
    • 具体聚集(Concrete Aggregate)角色:实现抽象聚集接口,创建出容纳迭代器的对象。

     Iterator.java

    public interface Iterator {
        public Object next();
        public boolean hasNext();
    }

    ConcreteIterator.java

    public class ConcreteIterator implements Iterator {
        private ConcreteAggregate agg;
        private int index = 0;
        private int size = 0;
        public ConcreteIterator(ConcreteAggregate agg) {
            this.agg = agg;
            size = agg.size();
            index = 0;
        }
        @Override
        public Object next() {
            if (index < size) {
                return agg.getElement(index++);
            } else {
                return null;
            }
        }
        @Override
        public boolean hasNext() {
            return index < size;
        }
    }

    Aggregate.java

    public interface Aggregate {
        public void add(Object obj);
        public Iterator createIterator();
    }

    ConcreteAggregate.java

    public class ConcreteAggregate implements Aggregate {
        private Vector vector = new Vector();
        @Override
        public void add(Object obj) {
            this.vector.add(obj);
        }
        public Object getElement(int index) {
            if (index < this.vector.size()) {
                return vector.get(index);
            } else {
                return null;
            }
        }
        public int size() {
            return vector.size();
        }
        @Override
        public Iterator createIterator() {
            return new ConcreteIterator(this);
        }
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            // 定义聚集对象
            Aggregate agg = new ConcreteAggregate();
            agg.add("张三");
            agg.add("李四");
            agg.add("王五");
            // 遍历
            Iterator iterator = agg.createIterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
            }
        }
    }

    运行结果如下所示。

    张三
    李四
    王五

    优点:

    • 简化了访问容器元素的操作,具备一个统一的遍历接口。
    • 封装遍历算法,使算法独立于聚集角色。客户无须知道聚集对象的类型,即使聚集对象的类型发生变化,也不会影响遍历进程。

    缺点:

    • 给使用者一个序列化的错觉,从而产生错误。

    应用场景:

    • 在java开发中,尽量不要自己写迭代器模式,使用Java API提供的Iterator一般就能满足项目要求。

    摘自:

    青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,133-138.

  • 相关阅读:
    jenkins代理设置
    通过jenkins api 触发远程构建
    python小技巧-统计列表中每个元素的个数
    python列表反转
    python 黑板课爬虫闯关-第三关
    python 黑板课爬虫闯关-第二关
    python 黑板课爬虫闯关-第一关
    python 黑板课爬虫闯关-第五关
    爬虫-识别图形验证码-tesserocr
    python 黑板课爬虫闯关-第四关
  • 原文地址:https://www.cnblogs.com/yewen1234/p/10030726.html
Copyright © 2011-2022 走看看