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:\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);
}
}