迭代器模式
顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:
MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,
iterator迭代模式,行为模式之一,他把容器包含的内部对象的访问委让给外部类,使用Iteartor(遍历) 按顺序进行遍历访问的设计模式
优点:1实现功能分离,简化容器接口,让容器只实现本身基本功能,把迭代功能委让给外部实现,符合类的设计原则
2 隐藏容器的具体实现细节 3 为容器或子容器提供一个统一的接口,一方面方便调用,另一方面使得调用者不必关注迭代具体实现 4 可以为容器或子容器实现不同的迭代方法或多个迭代方法
实例一:
public class Book { private String ISBN; private String name; private double price; public Book(String ISBN, String name, double price) { this.ISBN = ISBN; this.name = name; this.price = price; } public String getISBN() { return ISBN; } public void setISBN(String ISBN) { this.ISBN = ISBN; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public void dispaly(){ System.out.println("ISBN="+ISBN+ ",name="+name+",price="+price); } @Override public String toString() { return "Book{" + "ISBN='" + ISBN + '\'' + ", name='" + name + '\'' + ", price=" + price + '}'; } }public class BookList { private List<Book> bookList; private int index; public BookList() { bookList = new ArrayList<>(); } //添加书籍 public void addBook(Book book) { bookList.add(book); } //删除书籍 public void remoceBook(Book book) { int index = bookList.indexOf(book); bookList.remove(index); } /* //判断 public boolean hasNext(){ if(index >= bookList.size()) { return false; } return true; } //获取 public Book getNext(){ return bookList.get(index++); } public List<Book> getBookList() { return bookList; }*/ /** * 提供获取一个迭代器 * @return */ public Iterator iterator() { return new Itr(); } //内部类封装Iterator 迭代器模式 ,可以写不同的内部类,实现多个不同的迭代细节 private class Itr implements Iterator { @Override public boolean hasNext() { if(index >= bookList.size()) { return false; } return true; } @Override public Object next() { return bookList.get(index++); } @Override public void remove() { } } }
测试:
public static void main(String[] args) { BookList bookList = new BookList(); Book b = new Book("010203","java从入门熬精通",90); Book b1 = new Book("010204","java虚拟机",70); bookList.addBook(b); bookList.addBook(b1); //没用iterator模式::方式一:让容器自己实现iterator顺序遍历 // while(bookList.hasNext()) { // Book next = bookList.getNext(); // next.dispaly(); // } System.out.println("***********************"); //没用iterator模式:方式二让调用者自己实现遍历 // List<Book> bookList1 = bookList.getBookList(); // for(Book book : bookList1){ // book.dispaly(); // } Iterator iterator = bookList.iterator(); while(iterator.hasNext()) { Book next = (Book)iterator.next(); next.dispaly(); } } 测试结果: *********************** ISBN=010203,name=java从入门熬精通,price=90.0 ISBN=010204,name=java虚拟机,price=70.0
代码实现二:
public interface Collection { public Iterator iterator(); /*取得集合元素*/ public Object get(int i); /*取得集合大小*/ public int size(); } ********************************************************** public interface Iterator { //前移 public Object previous(); //后移 public Object next(); //判断是否含有下一个 public boolean hasNext(); //取得第一个元素 public Object first(); } ********************************************************** public class MyCollection implements Collection { public String string[] = {"A","B","C","D","E"}; // String arr[] = new String[5]; // String arrr[] = new String[]{"A","B","C","D","E"}; @Override public Iterator iterator() { return new MyIterator(this); } @Override public Object get(int i) { return string[i]; } @Override public int size() { return string.length; } } ********************************************************** public class MyIterator implements Iterator { private Collection collection; private int index = -1; public MyIterator(Collection collection) { this.collection = collection; } @Override public Object previous() { if(index > 0){ index--; } return collection.get(index); } @Override public Object next() { if(index < collection.size()-1){ index++; } return collection.get(index); } @Override public boolean hasNext() { if(index<collection.size()-1){ return true; }else{ return false; } } @Override public Object first() { index = 0; return collection.get(index); } } ********************************************************** public static void main(String[] args) { Collection collection = new MyCollection(); Iterator iterator = collection.iterator(); while(iterator.hasNext()){ Object next = iterator.next(); System.out.println(next); } } ********************************************************** 测试结果: A B C D E **********************************************************