zoukankan      html  css  js  c++  java
  • 「补课」进行时:设计模式(13)——迭代器模式

    1. 前文汇总

    「补课」进行时:设计模式系列

    2. 迭代器模式

    一说到迭代器,我首先想到的就是 Java 中的 java.util.Iterator 接口,打开看了一下 JDK1.8 的 API 文件,可以看到是从 1.2 的版本中开始添加 java.util.Iterator 这个接口,并逐步把 Iterator 应用到各个聚集类(Collection)中,同时可以看到另一个接口 java.lang.Iterable ,可以看到 java.lang.Iterable 有很多的子类以及实现类:

    基本上我们日常使用的类都在上面这张图里了, Java 把迭代器模式已经加入到了最基本的 API 当中,我们在使用各种集合进行迭代的时候才能如此的轻松写意。

    2.1 定义

    迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发,其定义如下:

    Provide a way to access the elements of an aggregate object sequentiallywithout exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)

    • Iterator: 抽象迭代器,基本上是有固定的3个方法: first() 获得第一个元素, next() 访问下一个元素, hasNext() 是否已经访问到底部。
    • ConcreteIterator: 具体迭代器角色要实现迭代器接口,完成容器元素的遍历。
    • Aggregate: 抽象容器,负责提供创建具体迭代器角色的接口。
    • ConcreteAggregate: 具体容器实现容器接口定义的方法,创建出容纳迭代器的对象。

    抽象迭代器:

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

    具体迭代器:

    public class ConcreteIterator implements Iterator {
    
        private Vector vector = new Vector();
    
        public int cursor = 0;
    
        public ConcreteIterator(Vector vector) {
            this.vector = vector;
        }
    
        @Override
        public Object next() {
            Object result = null;
            if (this.hasNext()) {
                result = this.vector.get(this.cursor++);
            } else {
                result = null;
            }
            return result;
        }
    
        @Override
        public boolean hasNext() {
            if (this.cursor == this.vector.size()) {
                return false;
            } else {
                return true;
            }
        }
    
        @Override
        public boolean remove() {
            this.vector.remove(this.cursor);
            return true;
        }
    }
    

    抽象容器:

    public interface Aggregate {
        void add(Object o);
        void remove(Object o);
        Iterator iterator();
    }
    

    具体容器:

    public class ConcreteAggregate implements Aggregate {
    
        private Vector vector = new Vector();
    
        @Override
        public void add(Object o) {
            this.vector.add(o);
        }
    
        @Override
        public void remove(Object o) {
            this.vector.remove(o);
        }
    
        @Override
        public Iterator iterator() {
            return new ConcreteIterator(vector);
        }
    }
    

    测试类:

    public class Test {
        public static void main(String[] args) {
            Aggregate agg = new ConcreteAggregate();
            agg.add("aaa");
            agg.add("bbb");
            agg.add("ccc");
            Iterator iter = agg.iterator();
            while (iter.hasNext()) {
                System.out.println(iter.next());
            }
        }
    }
    

    反过头来在看下 JDK 中的 Iterable 接口。 java.lang.Iterable 接口只有一个方法: iterator() ,也就说,通过 iterator() 这个方法去遍历聚集类中的所有方法或属性,基本上现在所有的高级语言都有 Iterator 这个接口或者实现, Java 已经把迭代器给我们准备好了,我们再去写迭代器,就有点多余了。所以呀,这个迭代器模式也有点没落了,基本上很少有项目再独立写迭代器了,直接使用 Collection 下的实现类就可以完美地解决问题。

  • 相关阅读:
    委托
    文件流
    关于.netFramework概述
    深拷贝与浅拷贝
    序列化与反序列化
    关于可空值类型
    正则表达式
    基于WF4.0的公文管理系统
    Mahout中相似度计算方法介绍
    Mahout源码目录说明
  • 原文地址:https://www.cnblogs.com/babycomeon/p/14003372.html
Copyright © 2011-2022 走看看