zoukankan      html  css  js  c++  java
  • 行为类型11-3:迭代器模式(Iterator Pattern)

    1. 概述

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

    给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

    2. 介绍

    2.1 意图

    提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

    2.2 主要解决

    不同的方式来遍历整个整合对象。

    2.3 何时使用

    遍历一个聚合对象。

    2.4 如何解决

    把在元素之间游走的责任交给迭代器,而不是聚合对象。

    2.5 关键代码

    定义接口:hasNext, next。

    **应用实例

    JAVA 中的 iterator。

    2.6 优点

    1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    2.7 缺点

    由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    2.8 使用场景

    1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口(即,支持多态迭代)。

    2.9 注意事项

    迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

    3. 参与者

    1.Iterator
    	迭代器定义访问和遍历元素的接口。
    
    2.ConcreteIterator
    	具体迭代器实现迭代器接口。
    	对该聚合遍历时跟踪当前位置。
    
    3.Aggregate
    	聚合定义创建相应迭代器对象的接口。
    
    4.ConcreteAggregate
    	具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例.
    

    4. 类图

    在这里插入图片描述

    5. 例子

    5.1 Iterator

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

    5.2 ConcreteIterator

    public class IteratorImpl implements Iterator {
    
        private List list;
        
        private int index;
        
        public IteratorImpl(List list) {
            index = 0;
            this.list = list;
        }
        
        public void first() {
            index = 0;
        }
    
        public void last() {
            index = list.getSize();
        }
    
        public Object next() {
            Object obj = list.get(index);
            index++;
            return obj;
        }
    
        public boolean hasNext() {
            return index < list.getSize();
        }
    }
    

    5.3 Aggregate

    public interface List {
    
        Iterator iterator();
        
        Object get(int index);
        
        int getSize();
        
        void add(Object obj);
    }
    

    5.4 ConcreteAggregate

    public class ListImpl implements List {
    
        private Object[] list;
        
        private int index;
        
        private int size;
        
        public ListImpl() {
            index = 0;
            size = 0;
            list = new Object[100];
        }
        
        public Iterator iterator() {
            return new IteratorImpl(this);
        }
        
        public Object get(int index) {
            return list[index];
        }
        
        public int getSize() {
            return this.size;
        }
        
        public void add(Object obj) {
            list[index++] = obj;
            size++;
        }
    }
    

    Test

    public class Test {
    
        public static void main(String[] args) {
            List list = new ListImpl();
            list.add("a");
            list.add("b");
            list.add("c");
            //第一种迭代方式
            Iterator it = list.iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }
            
            System.out.println("=====");
            //第二种迭代方式
            for (int i = 0; i < list.getSize(); i++) {
                System.out.println(list.get(i));
            }
        }
    }
    

    result

    a
    b
    c
    =====
    a
    b
    c
    

    6. 示例2

    我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。

    IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names
    在这里插入图片描述

    6.1

    public interface Iterator {
        public boolean hasNext();
        public Object next();
    }
    
    import com.sun.xml.internal.messaging.saaj.soap.name.NameImpl;
    
    public interface Container {
        public Iterator getIterator();
    }
    
    class NameRepository implements Container{
        public String names[] = {"Robert", "John", "Julie", "Lora"};
    
    
        @Override
        public Iterator getIterator() {
            return new NameIterator();
        }
    
        private class NameIterator implements Iterator{
            int index;
    
            @Override
            public boolean hasNext() {
                if(index < names.length)
                    return true;
                return false;
            }
    
            @Override
            public Object next() {
                if(this.hasNext())
                    return names[index++];
                return null;
            }
        }
    
    }
    
    

    test

    public class IteratorPatternDemo {
        public static void main(String[] args) {
            NameRepository nameRepository = new NameRepository();
            for (Iterator iter = nameRepository.getIterator(); iter.hasNext();){
                String name = (String) iter.next();
                System.out.println("Name : " + name);
            }
        }
    }
    
    

    result

    Name : Robert
    Name : John
    Name : Julie
    Name : Lora
    
    
  • 相关阅读:
    【源码学习之spark core 1.6.1 standalone模式下的作业提交】
    【源码学习之spark streaming 1.6.1 】
    spark udf 初识初用
    spark 累加历史 + 统计全部 + 行转列
    spark 都用了哪些开源东东
    kafka 官方示例代码--消费者
    104. 二叉树的最大深度
    237. 删除链表中的节点
    Leetcode-167. Two Sum II
    Leetcode-215. Kth Largest Element in an Array
  • 原文地址:https://www.cnblogs.com/daozhangblog/p/12446361.html
Copyright © 2011-2022 走看看