資料庫連線錯誤
阿新 • • 發佈:2021-01-28
設計模式
本系列文章均是博主原創,意在記錄學習上的知識,同時一起分享學習心得。提示:寫完文章後,目錄可以自動生成,如何生成可參考右邊的幫助文件
文章目錄
前言
本章一起學習迭代器模式的原理、使用方式和適用場景。
一、原理
迭代器是用來遍歷容器物件的,所以一個完整的迭代器模式一般會涉及容器和容器迭代器兩部分內容。為了達到基於介面而非實現程式設計的目的,容器又包括容器介面、容器實現類,迭代器又包含迭代器介面、迭代器實現類。
二、實現方式
迭代器的程式碼實現方式如下:
- 定義一個迭代器介面,並實現一個迭代器類。
- 定義一個容器介面,並實現一個容器類。
1、迭代器
先定義一個迭代器介面,迭代器介面有兩種定義方式:
- 第一種,包含3個方法。
方法名 | 描述 |
---|---|
next() | 用來將遊標後移一位 |
currentItem() | 返回當前遊標指向的元素 |
hasNext() | 判斷是否還有下一個元素 |
- 第二種,包含2個方法。
方法名 | 描述 |
---|---|
next() | 當前遊標指向的元素,並將遊標後移一位 |
hasNext() | 判斷是否還有下一個元素 |
第一種方式更加靈活一些,比如我們可以多次呼叫currentItem()查詢當前元素,而不移動遊標。
但是JDK的迭代器Iterator介面就是用的第二種方式,本示例程式碼也採用第二種。
程式碼如下(示例):
public class MyIterator implements Iterator {
int cursor;
List list;
public MyIterator(List list) {
this.cursor = 0;
this.list = list;
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public Object next () {
int i = cursor;
if (i >= list.size()) {
throw new RuntimeException();
}
cursor++;
return list.get(i);
}
}
2、容器
定義一個介面,其中該介面包含一個方法:
方法名 | 描述 |
---|---|
iterator() | 該方法返回一個迭代器類 |
程式碼如下(示例):
public class MyIterator implements Iterator {
int cursor;
List list;
public MyIterator(List list) {
this.cursor = 0;
this.list = list;
}
@Override
public boolean hasNext() {
return cursor < list.size();
}
@Override
public Object next() {
int i = cursor;
if (i >= list.size()) {
throw new RuntimeException();
}
cursor++;
return list.get(i);
}
}
測試程式碼:
@Test
public void testIterator() {
MyList<String> list = new MyList<>();
Iterator<String> iterator = list.iterator();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
總結
利用迭代器來遍歷有下面三個優勢:
- 迭代器模式封裝集合內部的複雜資料結構,開發者不需要了解如何遍歷,直接使用容器提供的迭代器即可;
- 迭代器模式將集合物件的遍歷操作從集合類中拆分出來,放到迭代器類中,讓兩者的職責更加單一;
- 迭代器模式讓新增新的遍歷演算法更加容易,更符合開閉原則。除此之外,因為迭代器都實現自相同的介面,在開發中,基於介面而非實現程式設計,替換迭代器也變得更加容易。