• 【图解设计模式一】Iterator模式


    一、知识概述

    Iterator 模式用于在数据集合中按照顺序遍历集合,其包含四种主要的角色:

    • Iterator:意为迭代器,负责声明按顺序逐个遍历元素的接口api
    • ConcreteIterator:为具体的迭代器,负责实现Iterator角色所声明的接口api
    • Aggregate:意为集合,负责声明创建Iterator角色的接口api
    • ConcreteAggregate:为具体的集合,负责实现Aggregate角色所声明的接口api

    二、示例程序

    以下为实现了Iterator模式的示例程序,这段示例程序的主要作用是将书放置到书架上,并通过迭代器遍历书架。

    类图示例

    Tips: 方法区上的类之间可以循环依赖,堆上的实例不可以循环依赖。类图表示的是方法区上类的关系,并非堆上实例关系。

    代码清单

    集合

    /**
     * 表示集合的接口
     */
    public interface Aggregate {
        // 方法声明:生成一个用于遍历集合的迭代器
        public abstract Iterator iterator();
    }
    
    /**
     * 表示书架(集合)的类
     */
    public class BookShelf implements Aggregate{
        private Book[] books;
        private int last = 0;
    
        public BookShelf(int maxsize) {
            this.books = new Book[maxsize];
        }
    
        public Book getBookAt(int index) {
            return books[index];
        }
    
        public void appendBook(Book book) {
            this.books[last] = book;
            last++;
        }
    
        public int getLength() {
            return last;
        }
    
        // 生成一个用于遍历书架的迭代器
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    

    迭代器

    /**
     * 遍历集合的接口
     */
    public interface Iterator {
        // 方法声明:判断是否存在下一个元素
        public abstract boolean hasNext();
    
        // 方法声明:获取下一个元素
        public abstract Object next();
    }
    
    /**
     * 遍历书架的类
     */
    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;
        }
    }
    

    实体

    /**
     * 表示书的Bean类
     */
    public class Book {
        private String name;
    
        public Book(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    

    三、课后习题

    习题:

    在示例程序中,当书的数量超过了书架的最大容量时,就无法继续向书架添加书本了。请使用java.util.ArrayList修改程序,使得书架的容量动态增加。
    

    回答:

    由于外界遍历并不依赖于BookShelf的实现,而是依赖于迭代器,所以此处仅需要将BookShelf类修改如下。

    /**
     * 表示书架(集合)的类
     */
    public class BookShelf implements Aggregate{
        private ArrayList<Book> books;
        private int last = 0;
    
        public BookShelf(int maxsize) {
            this.books = new ArrayList<Book>(maxsize);
        }
    
        public Book getBookAt(int index) {
            return books.get(index);
        }
    
        public void appendBook(Book book) {
            this.books.add(book);
            last++;
        }
    
        public int getLength() {
            return last;
        }
    
        // 生成一个用于遍历书架的迭代器
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    
  • 相关阅读:
    ArrayList源码分析_JDK1.8.0_191
    LinkedList源码分析_JDK1.8.0_191
    HashMap源码分析_JDK1.8.0_191
    生产者消费者模型Java实现
    INT整型最小值取负还是本身的问题
    字节跳动面试题
    go sqlx操作数据库问题
    go gin框架调用cmd运行python脚本问题
    Android视频播放不能使用自研播放器
    mac python版本错误问题以及pip版本错误(anacanda)
  • 原文地址:https://www.cnblogs.com/zzzz76/p/14410319.html
Copyright © 2020-2023  润新知