• Iterator模式(设计模式)


    Iterator模式

    生命在于坚持,坚持把设计模式学完
    建议:先简单把用UML画类图学习一下,至少要看的懂类图里面的不同类之间的关系
    参考:https://www.cnblogs.com/xrq730/p/5527115.html

    Aggregate:表示集合的接口
    Iterator:遍历集合的接口
    Book:表示书的类
    BookShelf:表示书架的类
    BookShelfIterator:遍历书架的类
    

    问题

    Warning: Missing VM type on line 35 of `D:JavaSoftjdk1.8.0_25-windowsjdk1.8.0_25jrelibi386
    jvm.cfg'
    
    解决:配置过程中不能存在空行,否则将报错,但是配置文件的最后一行需要留一行空白,否则也会报错,打开然后按这个要求检查一下是否符合条件
    

    个人理解

    Aggregate接口:它是一个集合模板,规定了总体抽象。它里面就只有一个属性,就是迭代器Iterator(注意:这个不是java API中的Utils包里面的Iterator类,这个迭代器类是我们自己后面定义的)

    迭代器Iterator接口:它是用来具体实现怎么把Aggregate集合中存储的元素一个个取出来进行遍历的方法类。它里面定义了两个抽象方法,hasNext()方法就是判断集合中是否还有可以取的元素,有的话就直接返回true,没有的话直接返回false。next()方法就是取当前的元素。按照英语的意思是取下一个元素,实际上在这个迭代器中的实现类里面会有一个index来记录取数据的时候的索引位置,取完数据后把索引指向下一个要取的数据的位置,这样就形成一种它自动迭代取数据的感觉。

    可以参考看一下java.util.Iterator接口,实现原理差不多。

    案例

    Aggregate.java

    /**
     * @Author:DarknessShadow
     * @description: 表示集合的接口
     * @date 2020/5/8 16:34
     */
    public interface Aggregate {
        /**
         * 用于生成一个用来遍历集合的迭代器
         */
        public abstract Iterator iterator();
    }
    

    Iterator.java

    /**
     * @Author:DarknessShadow
     * @description:用来遍历集合中元素
     * @date 2020/5/8 16:37
     */
    public interface Iterator {
        /**
         * 判断是否存在下一个元素,存在返回true,不存在返回false
         */
        public abstract boolean hasNext();
    
        /**
         * 获取下一个元素
         */
        public abstract Object next();
    }
    

    BookShelf.java

    /**
     * @Author:DarknessShadow
     * @description: 书集合类,既书架
     * @date 2020/5/8 16:43
     */
    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;
        }
    
        @Override
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    

    BookShelfIterator.java

    /**
     * @Author:DarknessShadow
     * @description:
     * @date 2020/5/8 16:47
     */
    public class BookShelfIterator implements Iterator {
    
        private BookShelf bookShelf;
        private int index;
    
        public BookShelfIterator(BookShelf bookShelf) {
            this.bookShelf = bookShelf;
            this.index = 0;
        }
    
        @Override
        public boolean hasNext() {
            if (index < bookShelf.getLength()) {
                return true;
            }
            return false;
        }
    
        @Override
        public Object next() {
            Book book = bookShelf.getBookAt(index);
            index ++;
            return book;
        }
    }
    

    Book.java

    /**
     * @Author:DarknessShadow
     * @description:书的类,主要记录书的相关属性
     * @date 2020/5/8 16:41
     */
    public class Book {
    
        public Book(String name) {
            this.name = name;
        }
    
        /**
         * 书名
         */
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    Main.java

    /**
     * @Author:DarknessShadow
     * @description: 测试主类
     * @date 2020/5/8 16:53
     */
    public class Main {
    
        public static void main(String[] args) {
            BookShelf bookShelf = new BookShelf(4);
            bookShelf.appendBook(new Book("Harrybot"));
            bookShelf.appendBook(new Book("Bible"));
            bookShelf.appendBook(new Book("Cinderella"));
            bookShelf.appendBook(new Book("Daddy-Long-legs"));
            Iterator it = bookShelf.iterator();
            while (it.hasNext()) {
                Book book = (Book) it.next();
                System.out.println(book.getName());
            }
        }
    }
    
  • 相关阅读:
    C语言使用正则表达式
    linux 有名管道(FIFO)
    sendto() 向广播地址发包返回errno 13, Permission denied错误
    NSUserDefaults(数据存储)
    iOS开发UI篇—UIScrollView控件实现图片缩放功能
    李洪强iOS开发之-环信02_iOS SDK 介绍及导入
    李洪强iOS开发之-环信01_iOS SDK 前的准备工作
    iOS开发UI篇—UIScrollView控件介绍
    iOS开发UI篇—iOS开发中三种简单的动画设置
    iOS开发UI篇—IOS开发中Xcode的一些使用技巧
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/12852090.html
Copyright © 2020-2023  润新知