有人用wordpress做企業(yè)seo做得比較好的公司
1.迭代器模式的定義
? ? ? ? 迭代器模式提供一種對(duì)容器對(duì)象中的各個(gè)元素進(jìn)行訪問的方法,而不需要暴露該對(duì)象的內(nèi)部細(xì)節(jié);
? ? ? ? 在軟件系統(tǒng)中,容器對(duì)象有兩個(gè)職責(zé):一是存儲(chǔ)數(shù)據(jù),二是遍歷數(shù)據(jù);從依賴性上看,前者是基本職責(zé),而后者是可以變化的,又是可以分離的,因此可以將遍歷數(shù)據(jù)的行為從容器中抽取出來,封裝到迭代器對(duì)象中,由迭代器來提供遍歷數(shù)據(jù)的行為,這將簡(jiǎn)化聚合對(duì)象的設(shè)計(jì),更加符合單一職責(zé)原則;
? ? ? ? 對(duì)于迭代器模式,設(shè)計(jì)時(shí)很少用到,但編碼時(shí)經(jīng)常用到,目前大多數(shù)編程語言中,迭代器已經(jīng)成為一個(gè)基礎(chǔ)的類庫,直接能用來遍歷集合對(duì)象;
1.1 迭代器模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 迭代器模式支持以不同方式遍歷一個(gè)集合對(duì)象,在同一個(gè)集合對(duì)象上可以定義多種遍歷方式,在迭代器模式中只需要用一個(gè)不同的迭代器來替換原有的迭代器,即可改變遍歷算法,也可以自己定義迭代器的子類以支持新的遍歷方式;
- 迭代器簡(jiǎn)化了集合類,原有的集合對(duì)象不需要再自行提供數(shù)據(jù)遍歷等方法;
- 由于引入了抽象層,增加新的集合類和迭代器類都很方便,無需修改原有代碼,滿足基于接口編程而非實(shí)現(xiàn)和開閉原則;
缺點(diǎn)
- 由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離,增加了類的個(gè)數(shù),增加了系統(tǒng)的復(fù)雜性;
- 抽象迭代器的設(shè)計(jì)難度較大,需要充分考慮到系統(tǒng)將來的擴(kuò)展;
1.2 迭代器模式的使用場(chǎng)景
- 減少程序中重復(fù)的遍歷代碼;
- 當(dāng)需要為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口時(shí)或當(dāng)訪問一個(gè)集合對(duì)象的內(nèi)容而無需暴露其內(nèi)部細(xì)節(jié)時(shí);
2.迭代器模式的原理
- 抽象集合類(Aggregate):用于存儲(chǔ)和管理元素對(duì)象,定義存儲(chǔ)、添加、刪除集合的功能,并且聲明了一個(gè) createIterator() 方法用于創(chuàng)建迭代器對(duì)象;
- 具體集合類(ConcreteAggregate):實(shí)現(xiàn)抽象集合類,返回一個(gè)具體迭代器的實(shí)例;
- 抽象迭代器類(Interator):定義訪問和遍歷集合元素的接口,通常包含 hasNext()、next() 等方法;
- 具體迭代器類(ConcreteIterator):實(shí)現(xiàn)抽象迭代器接口所定義的方法,完成對(duì)集合對(duì)象的遍歷,同時(shí)記錄遍歷的當(dāng)前位置;
3.迭代器模式的實(shí)現(xiàn)
【代碼】
? ? ? ? 抽象迭代器
public interface IteratorIterator<E> {void reset(); //重置為第一個(gè)元素E next(); //獲取下一個(gè)元素E currentItem(); //檢索當(dāng)前元素boolean hasNext(); //判斷是否還有下一個(gè)元素存在
}
? ? ? ? 抽象集合
public interface ListList<E> {//獲取迭代器對(duì)象的抽象方法(面向接口編程)IteratorIterator<E> Iterator();
}
????????具體迭代器
public class TopicIterator implements IteratorIterator<Topic> {//Topic數(shù)組private Topic[] topics;//記錄存儲(chǔ)位置private int position;public TopicIterator(Topic[] topics) {this.topics = topics;position = 0;}@Overridepublic void reset() {position = 0;}@Overridepublic Topic next() {return topics[position++];}@Overridepublic Topic currentItem() {return topics[position];}@Overridepublic boolean hasNext() {if(position >= topics.length){return false;}return true;}
}
? ? ? ? 抽象迭代器
public class TopicList implements ListList<Topic> {private Topic[] topics;public TopicList(Topic[] topics) {this.topics = topics;}@Overridepublic IteratorIterator<Topic> Iterator() {return new TopicIterator(topics);}
}
? ? ? ? 客戶端
public class Client {public static void main(String[] args) {Topic[] topics = new Topic[4];topics[0] = new Topic("topic1");topics[1] = new Topic("topic2");topics[2] = new Topic("topic3");topics[3] = new Topic("topic4");TopicList topicList = new TopicList(topics);IteratorIterator<Topic> iterator = topicList.Iterator();while(iterator.hasNext()){Topic t = iterator.next();System.out.println(t.getName());}}
}