Iterator模式(设计模式)

2020-05-08  本文已影响0人  DarknessShadow

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);
    }
}
上一篇下一篇

猜你喜欢

热点阅读