在企業的商業活動中,訂單是指交易雙方的產品或服務交易意向。交易下單負責創建這個交易雙方的產品或服務交易意向,有了這個意向後,買方可以付款,賣方可以發貨。 在電商場景下,買賣雙方沒有面對面交易,許多情況下需要通過超時處理自動關閉訂單 ...
Part1 ITerator模式
作用:迴圈不依賴具體的集合實現,擴展性比較好。
1.1 Iterator模式
使用Java語言顯示數據arr中的元素時,我們可以使用下麵的for迴圈語句遍曆數組。
for (int i = 0; i < arr.length; i++) {
System.out.println("i = " + i);
}
將此處i的作用抽象化、通化後形成的模式,在設計模式中稱為Iterator模式。
Iterator模式用於在數據集合中按照順序遍歷集合。英語中Iterator意味反覆做某事,漢語中稱之為“迭代器”。
1.2 示常式序
來看一段實現了Iterator模式的示常式序。這段示常式序的作用是將書(Book)放到書架(Bookshelf)中,並將書的名字按順序顯示出來。
Iterator模式重點概念:
名稱 | 說明 | 角色 |
---|---|---|
Aggregate 介面 | 表示集合的介面 | 集合 |
Iterator 介面 | 遍歷集合的介面 | 迭代器 |
Book 類 | 表示 書的類 | |
BookShelf 類 | 表示書架類 | 具體的集合 |
BookShelfIterator 類 | 表示遍曆書架的類 | 具體的迭代器 |
類圖說明
代碼清單1-1 Aggregate介面
public interface Aggregate {
public abstract Iterator iterator();
}
在Aggregate介面中聲明的方法只有一個——iterator()方法。該方法會生成一個用於遍歷集合的迭代器。
想要遍歷集合中的元素時,調用Aggregate#iterator() 方法來生成一個實現了Iterator介面的 類的實例。
代碼清單1-2 Iterator介面
public interface Iterator {
Boolean hasNext();
Object next();
}
hasNext()是否還存在元素,用來控制是否需要進行下次遍歷。
next()方法,獲取當前下標位置的對象,並移動下標位置。
代碼清單1-3 Book類
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {
String name;
}
Book實體類
代碼清單1-4 BookShelf
@Data
public class BookShelf implements Aggregate{
Book[] books;
Integer last = 0;
public BookShelf(Integer maxSize) {
this.books = new Book[maxSize];
}
public Book getIndexAt(Integer index){
return books[index];
}
public void appendBook(Book book){
this.books[last] = book;
last++;
}
public Integer getLength(){
return last;
}
@Override
public Iterator iterator() {
return new BookShelfIterator(this);
}
}
書架實體類。 需要將此類作為集合處理,所以需要繼承集合類Aggregate,實現獲取迭代器方法iterator();
代碼清單1-5 BookShelfIterator
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 Boolean.TRUE;
}else {
return Boolean.FALSE;
}
}
@Override
public Object next() {
Book book = bookShelf.getIndexAt(index);
index++;
return book;
}
}
用於遍曆書架的類,需要有遍歷功能因此繼承了Iterator介面。
- 初始化時,bookShelf 屬性表明需要遍歷的書架;index 屬性表明下表的位置,初始化為0。
- hasNext()方法需要返回是否還有下一個元素要處理,True代表有,False代表沒有。使用index和getLength()總冊數的對比來判斷。
- next() 方法獲取當前下標位置的對象用做返回,並且移動下標到下個位置。
代碼清單1-5 main函數
public class Main {
public static void main(String[] args) {
BookShelf bookShelf = new BookShelf(4);
bookShelf.appendBook(new Book("《西游記》"));
bookShelf.appendBook(new Book("《紅樓夢》"));
bookShelf.appendBook(new Book("《三國演義》"));
bookShelf.appendBook(new Book("《水滸傳》"));
Iterator it = bookShelf.iterator();
while(it.hasNext()){
Book next = (Book)it.next();
System.out.println("next = " + next);
}
}
}
main函數可以看出,整個while迴圈只調用了hasNext()和next()方法,並不依賴BookShelf具體的集合對象。如果集合對象發生變化,不影響這部分代碼。擴展性比較好。