zoukankan      html  css  js  c++  java
  • 迭代器模式-Iterator

    一、定义

    迭代器模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

    二、结构

    (1)迭代器角色(Iterator):定义遍历元素所需要的方法,一般来说会有这么三个方法:

    • next():获取下一个元素的方法
    • hasNext():判断是否遍历结束的方法
    • remove():移出当前对象的方法

    (2)具体迭代器角色(Concrete Iterator):实现迭代器接口中定义的方法,完成集合的迭代。

    (3)容器角色(Aggregate):  一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等

    (4)具体容器角色(ConcreteAggregate):就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。

    三、例子

    抽象的集合

    /**
     * 抽象的聚集。(可以理解为Java中的Collection接口)
     */
    public interface Aggregate {
    
        //返回迭代器
        Iterator iterator();
    
    }

    抽象的迭代器

    /**
     * 抽象的迭代器
     */
    public interface Iterator {
    
        //移动到第一个元素
        void first();
    
        //是否还有元素
        boolean hasNext();
    
        //返回下一个元素
        Object next();
    
    }

    具体的集合

    /**
     * 具体的聚集(可以理解为Java中的Collection的实现类)
     */
    public class ConcreteAggregate implements Aggregate {
    
        private Object[] list = {"zhangsan", "lisi", "wangwu", "zhaoliu"};
    
        public Object getElement(int index) {
            if (index < list.length) {
                return list[index];
            }
            //越界
            return null;
        }
    
        public int size() {
            return list.length;
        }
    
        /**
         * 由当前具体的聚集返回迭代器
         */
        @Override
        public Iterator iterator() {
            return new ConcreteIterator(this);
        }
    }

    具体的迭代器

    /**
     * 具体的迭代器
     */
    public class ConcreteIterator implements Iterator {
    
        private ConcreteAggregate concreteAggregate;
        private int index;
        private int size;
    
        public ConcreteIterator(ConcreteAggregate concreteAggregate) {
            this.concreteAggregate = concreteAggregate;
            size = concreteAggregate.size();
            index = 0;
        }
    
        @Override
        public void first() {
            index = 0;
        }
    
        @Override
        public boolean hasNext() {
            return index < size;
        }
    
        @Override
        public Object next() {
            return concreteAggregate.getElement(index++);
        }
    }

    客户端代码

    public class Client {
    
        public static void main(String[] args) {
            Aggregate aggregate = new ConcreteAggregate();
            Iterator iterator = aggregate.iterator();
            while (iterator.hasNext()) {
                Object element = iterator.next();
                System.out.println(element);
            }
        }
    
    }
    
    打印结果:
        zhangsan
        lisi
        wangwu
        zhaoliu
  • 相关阅读:
    「ZJOI2019」&「十二省联考 2019」题解索引
    jmeter测试20个QPS下的响应时间-设置QPS限制
    Postman的基础使用
    Selenium如何定位动态id的元素?
    python+selenium:iframe框架中多种定位
    关于正则表达式
    项目关键路径
    paycharm导入webdriver包报错:module 'selenium.webdriver' has no attribute 'Firefox'
    随着firefox的迭代更新:FireBug不能用了?使用火狐Try Xpath插件替代Firebug和Firepath
    Python——连接操作数据库
  • 原文地址:https://www.cnblogs.com/rouqinglangzi/p/11080083.html
Copyright © 2011-2022 走看看