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

    1、概念

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

    2、模式结构

    • 抽象迭代器(Iterator):此抽象角色定义出遍历元素所需的接口
    • 具体迭代器(ConcreteIterator):此角色实现了Iterator接口,并保持迭代过程中的游标位置
    • 抽象容器(Aggregate):容器角色负责提供创建具体迭代器角色的接口,必然提供一个类似createIterator()这样的方法,在Java中一般是iterator()方法
    • 具体容器(ConcreteAggregate):实现容器接口定义的方法,创建出容纳迭代器的对象

    3、使用场景

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

    4、优缺点

    优点:

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

    缺点:

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

    5、实例

    定义抽象迭代器Iterator

    public interface Iterator<T> {
        boolean hasNext();
    
        T first();
    
        T next();
    }
    

    定义具体迭代器FilmMenuIterator

    public class FilmMenuIterator implements Iterator<MenuItem> {
    
        private List<MenuItem> menuItems;
        private int position = 0;
    
        public FilmMenuIterator(List<MenuItem> itemList) {
            menuItems = itemList;
        }
    
        @Override
        public boolean hasNext() {
            if (position > menuItems.size() - 1 || menuItems.get(position) == null) {
                return false;
            } else {
                return true;
            }
        }
    
        @Override
        public MenuItem first() {
            return menuItems.size() > 0 ? menuItems.get(0) : null;
        }
    
        @Override
        public MenuItem next() {
            MenuItem menuItem = menuItems.get(position);
            position++;
            return menuItem;
        }
    }
    

    定义抽象容器MenuAggregate

    public interface MenuAggregate<T> {
        void addItem(int id, String name);
    
        Iterator<T> create();
    }
    

    定义具体容器FilmAggregate

    public class FilmAggregate implements MenuAggregate<MenuItem> {
    
        private List<MenuItem> menuItems;
    
        public FilmAggregate() {
            menuItems = new ArrayList<>();
        }
    
        @Override
        public void addItem(int id, String name) {
            menuItems.add(new MenuItem(id, name));
        }
    
        @Override
        public Iterator<MenuItem> create() {
            return new FilmMenuIterator(menuItems);
        }
    }
    

    客户端实现

    FilmAggregate film = new FilmAggregate();
    film.addItem(1, "西红柿首富");
    film.addItem(2, "兄弟");
    film.addItem(2, "反贪风暴");
    Iterator it = film.create();
    while(it.hasNext()){
        System.out.println(it.next().toString());
    }
    
  • 相关阅读:
    USACO 2.3 和为零 (DFS)
    公牛和母牛 (Standard IO)
    【NOIP2016提高A组模拟10.15】算循环
    USACO 2.2 集合(DP)
    USACO 2.2 序言页码 (MATH)
    NET实现微信公共平台上传下载多媒体文件(转)
    asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
    LINQ to SQL语句
    JS时间(日期)比较或相减(暂时停用)
    json格式字符串处理
  • 原文地址:https://www.cnblogs.com/fomin/p/9993734.html
Copyright © 2011-2022 走看看