zoukankan      html  css  js  c++  java
  • 一天一个设计模式——迭代器模式

    一、模式说明

    迭代操作在程序开发中很常见:在数据集合中按顺序便利所有元素(例如:遍历一个数组中的所有元素),将遍历时使用的索引(如访问数组循环变量i)抽象化、通用化后形成的模式就是迭代器模式。

    核心的迭代器一般包含两个方法:hasNext()和next()方法,前一个方法用于判断集合中是否还存在下一个需要迭代的元素,返回值类型是Bool类型;next()方法用于返回集合中一个元素,并且将迭代器移动到下一个元素。

    该模式的UML图和示例代码UML图如下:

    迭代模式的UML很简单,包含两个接口:Aggregate接口和Iterator接口,对应ConcreteAggregate角色和ConcreteIterator角色。

    • Aggregate接口包含一个iterator方法,该方法返回一个iterator迭代器。
    • Iterator接口包含hasNext()和next()两个方法。

    上图中,设计两个接口,而没有只使用一个Iterator接口,原因在于我们需要将“遍历功能”独立于ConcreteAggregate角色之外,这样就可以针对一个ConcreteAggregate角色编写多种不同的ConcreteIterator角色(从前向后遍历、从后向前遍历previous、跳跃遍历)。

    二、模式中的角色:

    • Iterator:迭代器角色:定义访问和遍历元素的接口;
    • Aggregate:集合角色:定义创建Iterator迭代器的接口;
    • ConcreteIterator:迭代器实现类;
    • ConcreteAggretator:具体聚合实现累;

    三、模式代码示例:

    (代码分为两个包,patterndesign包用于设计模式的代码实现,patterndemostrate用于模式代码的使用实例说明)

    代码结构:

    模式相关代码:

    Aggregrate接口:

    package com.designpattern.cn.iteratorpattern.patterndesign;
    
    public interface Aggregate {
        public abstract Iterator iterator();
    }
    View Code

    Iterator接口:

    package com.designpattern.cn.iteratorpattern.patterndesign;
    
    public interface Iterator {
        public abstract boolean hasNext();
        public abstract Object next();
    }
    View Code

    模式实现演示:

    Book书籍类:

    package com.designpattern.cn.iteratorpattern.patterndemostrate;
    
    public class Book {
        private String name;
    
        public Book(String name){
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    View Code

    BookShelf书架类(类似模拟一个集合类):

    package com.designpattern.cn.iteratorpattern.patterndemostrate;
    
    import com.designpattern.cn.iteratorpattern.patterndesign.Aggregate;
    import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;
    
    public class BookShelf implements Aggregate {
    
        private Book books[];
        private int last = 0;
    
        public BookShelf(int size){
            this.books = new Book[size];
        }
    
        public Book getBookAt(int index){
            return books[index];
        }
    
        public void appendBook(Book book){
            this.books[last] = book;
            last++;
        }
    
        public int getLength(){
            return last;
        }
    
        @Override
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    View Code

    迭代器类(实现了书架类(模拟集合)中元素的迭代):

    package com.designpattern.cn.iteratorpattern.patterndemostrate;
    
    import com.designpattern.cn.iteratorpattern.patterndesign.Iterator;
    
    public class BookShelfIterator implements Iterator {
        private BookShelf bookShelf;
        private int index;
    
        public BookShelfIterator(BookShelf bookShelf){
            this.bookShelf = bookShelf;
            this.index = 0;
        }
    
        public boolean hasNext(){
            return index < bookShelf.getLength();
        }
    
        public Object next(){
            Book book = bookShelf.getBookAt(index);
            index++;
            return book;
        }
    }
    View Code

    运行结果:

    四、相关的模式

    • Visitor模式(访问者模式):迭代模式仅仅遍历取出元素,并没有做任何处理,如果遍历元素的同时对每个元素做相同的处理,则这种模式是visitor模式(访问者模式);
    • Factory Method模式(工厂方法模式):在iterator方法中生成Iterator实例时可能采用到工厂方法模式;

    此随笔参照中国工信出版集团,人民邮电出版社的《图解设计模式》梳理。

  • 相关阅读:
    C# Distinct去重泛型List
    分布式高并发系统如何保证对外接口的幂等性?转载
    描述文件安装失败:Please ensure the provisioning profile is configured for this device. If not, please try to generate
    Java基础-概述
    Java基础-语法
    使用 Proxifier + Charles 抓取本机 Http请求 /
    Git回退服务器版本及receive.denyDeleteCurrent配置
    codeforces#1549D. Integers Have Friends
    NOI 2021 ~Last Celebration~
    docker
  • 原文地址:https://www.cnblogs.com/zheng-hong-bo/p/11068935.html
Copyright © 2011-2022 走看看