您好,登錄后才能下訂單哦!
將循環(huán)變量i的作用抽象化,通用化形成的模式,在設(shè)計(jì)模式中稱為Iterator模式(迭代器模式),該模式用于在數(shù)據(jù)集合中按照順序遍歷集合
為了回答這個(gè)問題,我們先看示例程序:
?1.?示例程序的類圖
?2.?類和接口的示意圖
?3.?示例程序
??>1.?Aggregate接口
package com.zgz.dm.Iterator;
/**
* 表示集合的接口
* @author guozhenZhao
* @date 2018年6月12日
*/
public interface Aggregate {
//該方法生成一個(gè)用于遍歷集合的迭代器
public abstract Iterator iterator();
}
??>2.?Iterator接口
package com.zgz.dm.Iterator;
/**
* 該接口用于遍歷集合中的元素
* @author guozhenZhao
* @date 2018年6月12日
*/
public interface Iterator {
//判斷集合中是否存在下一個(gè)元素
public abstract boolean hasNext();
//獲取集合中的下一個(gè)元素
public abstract Object next();
}
??>3.?Book類
package com.zgz.dm.Iterator;
/**
* 表示書這個(gè)類
* @author guozhenZhao
* @date 2018年6月12日
*/
public class Book {
private String name;
public String getName() {
return name;
}
public Book(String name) {
super();
this.name = name;
}
}
??>4.?BookShelf類
package com.zgz.dm.Iterator;
/**
* 表示書架的類
* @author guozhenZhao
* @date 2018年6月12日
*/
import java.util.ArrayList;
import java.util.List;
public class BookShelf implements Aggregate {
//private Book[] books;
//private int last = 0;
private List<Book> books;
public BookShelf() {
super();
this.books = new ArrayList<Book>();
}
//獲取書架中對(duì)應(yīng)的書
public Book getBookAt(int index) {
//return books[index];
return books.get(index);
}
//向書架中添加書
public void appendBook(Book book) {
//this.books[last] = book;
//last++;
this.books.add(book);
}
//獲取書架的長度
public int getLength() {
//return last;
return books.size();
}
//遍歷書架中的書
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new BookShelfIterator(this);
}
}
??>5.?BookShelfIterator類
package com.zgz.dm.Iterator;
/**
* 遍歷書架的類
* @author guozhenZhao
* @date 2018年6月12日
*/
public class BookShelfIterator implements Iterator{
private BookShelf bookShelf;
private int index;
public BookShelfIterator(BookShelf bookShelf) {
super();
this.bookShelf = bookShelf;
this.index = 0;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if (index < bookShelf.getLength()) {
return true;
}else {
return false;
}
}
@Override
public Object next() {
// TODO Auto-generated method stub
Book book = bookShelf.getBookAt(index);
index++;
return book;
}
}
??>6.?測(cè)試類
package com.zgz.dm.Iterator;
/**
* 測(cè)試類
* @author guozhenZhao
* @date 2018年6月12日
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
BookShelf bookShelf = new BookShelf();
bookShelf.appendBook(new Book("追風(fēng)箏的人"));
bookShelf.appendBook(new Book("java編程思想"));
bookShelf.appendBook(new Book("SSM整合"));
bookShelf.appendBook(new Book("平凡的世界"));
bookShelf.appendBook(new Book("springBoot"));
Iterator it = bookShelf.iterator();
while(it.hasNext()) {
Book book = (Book)it.next();
System.out.println(book.getName());
}
}
}
讀完示例程序,回答上面的問題,為什么要有Iterator模式呢?如果是數(shù)組的話直接使用for循環(huán)遍歷不就得了。在上面的程序中有一個(gè)BookShelf類,其中一個(gè)方法,如下圖:
在這個(gè)方法中返回的是Iterator并不是對(duì)應(yīng)的對(duì)象類,在測(cè)試類中遍歷的時(shí)候,如下圖:
上面的代碼調(diào)用的是Iterator的hasNext()方法和next方法,此時(shí)的while循環(huán)不依賴BookShelf類的實(shí)現(xiàn)。所以引入Iterator后可以將遍歷和實(shí)現(xiàn)分離開。設(shè)計(jì)模式的作用就是幫助我們編寫可以復(fù)用的類,所謂的可復(fù)用就是將類實(shí)現(xiàn)為一個(gè)組件,在需要變動(dòng)時(shí),便于修改,所以也就不難理解為啥上圖代碼返回的是Iterator類型了。學(xué)習(xí)設(shè)計(jì)模式,其思想在于:
不要只使用具體類編程,優(yōu)先使用抽象類和借口來編程
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。