工作中很少有自己去寫(xiě)迭代器的情況捉偏,但是有必要了解一下迭代器的內(nèi)部結(jié)構(gòu)捷兰。
優(yōu)點(diǎn):
簡(jiǎn)化了遍歷方式,對(duì)于對(duì)象集合的遍歷固阁,還是比較麻煩的壤躲,對(duì)于數(shù)組或者有序列表,我們尚可以通過(guò)游標(biāo)來(lái)取得您炉,但用戶需要在對(duì)集合了解很清楚的前提下柒爵,自行遍歷對(duì)象,但是對(duì)于hash表來(lái)說(shuō)赚爵,用戶遍歷起來(lái)就比較麻煩了棉胀。而引入了迭代器方法后法瑟,用戶用起來(lái)就簡(jiǎn)單的多了。
可以提供多種遍歷方式唁奢,比如說(shuō)對(duì)有序列表霎挟,我們可以根據(jù)需要提供正序遍歷,倒序遍歷兩種迭代器麻掸,用戶用起來(lái)只需要得到我們實(shí)現(xiàn)好的迭代器酥夭,就可以方便的對(duì)集合進(jìn)行遍歷了。
封裝性良好脊奋,用戶只需要得到迭代器就可以遍歷熬北,而對(duì)于遍歷算法則不用去關(guān)心。
缺點(diǎn):
- 對(duì)于比較簡(jiǎn)單的遍歷(像數(shù)組或者有序列表)诚隙,使用迭代器方式遍歷較為繁瑣讶隐,大家可能都有感覺(jué),像ArrayList久又,我們寧可愿意使用for循環(huán)和get方法來(lái)遍歷集合巫延。
主要角色:
迭代器角色:一般為接口,主要定義迭代器該有的屬性地消。
具體迭代器角色:主要實(shí)現(xiàn)迭代器角色接口的方法炉峰。
容器角色:數(shù)據(jù)容器。
創(chuàng)建迭代器角色:
/**
* 這是一個(gè)迭代器接口
* first 游標(biāo)第一個(gè)對(duì)象
* next 游標(biāo)下一個(gè)對(duì)象
* hasNext 游標(biāo)是否存在下一個(gè)對(duì)象
* isFirst 是否是第一個(gè)對(duì)象
* isLast 是否是最后一個(gè)對(duì)象
* getCurrentObj 獲取當(dāng)前對(duì)象
*/
public interface MyIterator {
void first();
void next();
boolean hasNext();
boolean isFirst();
boolean isLast();
Object getCurrentObj();
}
創(chuàng)建容器角色:
import java.util.ArrayList;
import java.util.List;
/**
* 這是一個(gè)容器對(duì)象
*/
public class ConcreteAggregate {
private List<Object> list = new ArrayList<Object>();
//數(shù)據(jù)新增方法
public void addObject(Object object) {
this.list.add(object);
}
//數(shù)據(jù)刪除方法
public void removeObject(Object object) {
this.list.remove(object);
}
//獲取list方法
public List<Object> getList() {
return list;
}
//設(shè)置list方法
public void setList(List<Object> list) {
this.list = list;
}
}
創(chuàng)建具體迭代器角色:
import java.util.List;
/**
* 這是一個(gè)具體迭代器角色
* cursor 定義游標(biāo)用于記錄遍歷時(shí)的位置
*/
public class ConcreteIterator implements MyIterator {
private List<Object> list;
private int cursor;
public ConcreteIterator(List<Object> list) {
this.list = list;
}
@Override
public void first() {
cursor = 0;
}
@Override
public void next() {
if (cursor < list.size()) {
cursor++;
}
}
@Override
public boolean hasNext() {
if (cursor < list.size()) {
return true;
}
return false;
}
@Override
public boolean isFirst() {
return cursor == 0 ? true : false;
}
@Override
public boolean isLast() {
return cursor == (list.size() - 1) ? true : false;
}
@Override
public Object getCurrentObj() {
return list.get(cursor);
}
}
測(cè)試:
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
/**
* 這是調(diào)用者
*/
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.addObject("張三");
aggregate.addObject("李四");
aggregate.addObject("王五");
MyIterator iterator = new ConcreteIterator(aggregate.getList());
while (iterator.hasNext()) {
Log.d("TAG", iterator.getCurrentObj() + "");
iterator.next();
}
}
}
結(jié)果:已完成測(cè)試脉执!有不對(duì)的地方歡迎指出疼阔,感恩。