一、什麼是迭代模式?
Iteration模式也叫迭代模式,是行爲模式之一,它把對容器中包含的內部對象的訪問委讓給外部類,使用Iteration(遍歷)按順序進行遍歷訪問的設計模式。
二、不使用迭代模式的應用
在應用Iterator模式之前,首先應該明白Iteratior模式用來解決什麼問題。或者說,如果不使用Iterator模式,會存在什麼樣的問題。
1、由容器自己實現順序遍歷。直接在容器類裏直接添加順序遍歷方法
2、讓調用者自己實現遍歷。直接暴露數據細節給外部
三、代碼實現
1、由容器自己實現順序遍歷。直接在容器類裏直接添加順序遍歷方法
1.1、創建Book類
package com.renxin.iterator;
public class Book {
private int id;
private String name;
private double price;
public Book(int id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 display() {
System.out.println("編號:"+id+",書名:"+name+",價格:"+price);
}
}
1.2、創建BookList類:
package com.renxin.iterator;
import java.util.ArrayList;
import java.util.List;
public class BookList {
private List<Book> bookList;
private int index;
public BookList() {
bookList = new ArrayList<Book>();
}
//添加書籍
public void addBook(Book book) {
bookList.add(book);
}
//刪除書籍
public void deleteBook(Book book) {
int bookIndex = bookList.indexOf(book);
bookList.remove(bookIndex);
}
//判斷是否有一本書
public boolean hasNext() {
if(index >= bookList.size()) {
return false;
}
return true;
}
//獲得下一本書
public Book getNext() {
return bookList.get(index++);
}
}
1.3、創建測試類MainClass
package com.renxin.iterator;
public class MainClass {
public static void main(String[] args) {
BookList bookList = new BookList();
Book book1 = new Book(1,"《Java編程思想》",80);
Book book2 = new Book(2,"《Java從精通到放棄》",60);
bookList.addBook(book1);
bookList.addBook(book2);
while(bookList.hasNext()) {
Book book = bookList.getNext();
book.display();
}
}
}
控制檯打印結果爲:
編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0
2、讓調用者自己實現遍歷。直接暴露數據細節給外部
2.1、修改BookList
package com.renxin.iterator;
import java.util.ArrayList;
import java.util.List;
public class BookList {
private List<Book> bookList;
private int index;
public BookList() {
bookList = new ArrayList<Book>();
}
//添加書籍
public void addBook(Book book) {
bookList.add(book);
}
//刪除書籍
public void deleteBook(Book book) {
int bookIndex = bookList.indexOf(book);
bookList.remove(bookIndex);
}
//方法一:
/*//判斷是否有一本書
public boolean hasNext() {
if(index >= bookList.size()) {
return false;
}
return true;
}
//獲得下一本書
public Book getNext() {
return bookList.get(index++);
}*/
//方法二
public List<Book> getBookList(){
return bookList;
}
}
2.2、修改測試類MainClass
package com.renxin.iterator;
import java.util.List;
public class MainClass {
public static void main(String[] args) {
BookList bookList = new BookList();
Book book1 = new Book(1,"《Java編程思想》",80);
Book book2 = new Book(2,"《Java從精通到放棄》",60);
bookList.addBook(book1);
bookList.addBook(book2);
/*while(bookList.hasNext()) {
Book book = bookList.getNext();
book.display();
}*/
List<Book> bookDateList = bookList.getBookList();
for(int i = 0;i< bookDateList.size();i++) {
Book book = bookDateList.get(i);
book.display();
}
}
}
控制檯輸出結果爲:
編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0
四、不使用迭代模式的缺點
以上方法1與方法2都可以實現對遍歷,這樣又問題呢?
1、容器類承擔了太多功能:一方面需要提供添加刪除等本身應有的功能;一方面還需要提供遍歷訪問的功能。
2、往往容器在實現遍歷的過程中,需要保存遍歷狀態,當跟元素的添加刪除等功能夾雜在一起,很容易引起混亂和程序運行錯誤等。
五、使用迭代模式的應用
Iterator模式就是爲了有效地處理順序進行遍歷訪問的一種設計模式,簡單地說,Iterator模式提供一種有效的方法,可以屏蔽聚焦對象集合的容器類的實現細節,而能對容器內包含的對象元素按順序進行有效的遍歷訪問。所以,Iterator模式的應用場景可以歸納爲滿足以下幾個條件:1、訪問容器中包含內部對象;2、按順序訪問
六、迭代模式的結構
七、迭代模式的角色和職責
Iterator(迭代器接口):該接口必須定義實現迭代功能的最小定義方法集,比如提供hasNext()和next()方法。
Concreteiterator(迭代器實現類):迭代器接口Iterator的實現類。可以根據具體情況加以實現。
Aggregate(容器接口):定義基本功能以及提供類似Iterator iterator()方法。
ConcreteAggregate(容器實現類):容器接口的實現類,必須實現Iterator iterator()方法。
代碼實現:
(1)修改BookList
package com.renxin.iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BookList {
private List<Book> bookList;
private int index;
private Iterator iterator;
public BookList() {
bookList = new ArrayList<Book>();
}
//添加書籍
public void addBook(Book book) {
bookList.add(book);
}
//刪除書籍
public void deleteBook(Book book) {
int bookIndex = bookList.indexOf(book);
bookList.remove(bookIndex);
}
//方法一:
/*//判斷是否有一本書
public boolean hasNext() {
if(index >= bookList.size()) {
return false;
}
return true;
}
//獲得下一本書
public Book getNext() {
return bookList.get(index++);
}*/
//方法二
/*public List<Book> getBookList(){
return bookList;
}*/
public Iterator Iterator() {
return new Itr();
}
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++);
}
}
}
(2)、修改MainClass
package com.renxin.iterator;
import java.util.Iterator;
public class MainClass {
public static void main(String[] args) {
BookList bookList = new BookList();
Book book1 = new Book(1,"《Java編程思想》",80);
Book book2 = new Book(2,"《Java從精通到放棄》",60);
bookList.addBook(book1);
bookList.addBook(book2);
/*while(bookList.hasNext()) {
Book book = bookList.getNext();
book.display();
}*/
/* List<Book> bookDateList = bookList.getBookList();
for(int i = 0;i< bookDateList.size();i++) {
Book book = bookDateList.get(i);
book.display();
}*/
Iterator iter = bookList.Iterator();
while(iter.hasNext()) {
Book book = (Book) iter.next();
book.display();
}
}
}
控制檯輸出結果爲:
編號:1,書名:《Java編程思想》,價格:80.0
編號:2,書名:《Java從精通到放棄》,價格:60.0
八、迭代模式的優點
1、實現功能分離,簡化容器接口。讓容器只實現本身的基本功能,把迭代功能委讓給外部類實現,符合類的設計原則。
2、隱藏容器的實現細節。
3、爲容器或其子容器提供一個統一接口,一方面方便調用;另一方面使得調用者不必關注迭代器的實現細節。
4、可以爲容器或其子容器實現不同的迭代方法或多個迭代方法