美文网首页
Iterator模式(设计模式)

Iterator模式(设计模式)

作者: DarknessShadow | 来源:发表于2020-05-08 17:57 被阅读0次

    Iterator模式

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

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

    问题

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

    个人理解

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

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

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

    拓展

    不要将思维固化,这里使用的是面向接口编程思想,就是使用接口当作对外被使用的门户,里面的具体实现是对外部不可见的也就是透明的。这样如果内部需要修改或者升级什么的,也不会影响调用的地方。这样就可以减少类与类之间的耦合,也就是关联关系

    可以在Aggregate接口中实现多种迭代器来实现不同功能的遍历,比如:从后往前遍历、只遍历奇数个元素等

    案例

    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());
            }
        }
    }
    

    升级

    这里只能往集合里面存储固定数量的书籍,如果书籍超过数量的话,就需要扩容,所以这里的书架容量不能是固定的。

    可以无限量的存储书。修改:BookShelf.java

    public class BookShelf implements Aggregate {
    
        private List books;
        private int last = 0;
    
        public BookShelf(int maxsize) {
            this.books = new ArrayList(maxsize);
        }
    
        public Book getBookAt(int index) {
            return (Book)books.get(index);
        }
    
        public void appendBook(Book book) {
            this.books.add(book);
            last++;
        }
    
        public int getLength(){
            return last;
        }
    
        @Override
        public Iterator iterator() {
            return new BookShelfIterator(this);
        }
    }
    

    相关文章

      网友评论

          本文标题:Iterator模式(设计模式)

          本文链接:https://www.haomeiwen.com/subject/ztawwhtx.html