久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1668|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

迭代器模式

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-5 23:33 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
摘要:本文深入淺出的講述了設(shè)計(jì)模式中的迭代器模式,并給出了簡單的示例,例子淺顯易懂,并附帶源代碼。
       迭代器模式屬于行為型模式,其意圖是提供一種方法順序訪問一個(gè)聚合對(duì)象中得各個(gè)元素,而又不需要暴露該對(duì)象的內(nèi)部表示。一個(gè)聚合對(duì)象,比如列表,應(yīng)該提供一種方法來讓別人可以訪問他的元素。而又不需要暴露他的內(nèi)部結(jié)構(gòu),此外,針對(duì)不同的需求,可能要以以下不同的方式遍歷這個(gè)列表,但是即使可以預(yù)見所需要的那些遍歷操作,你可能也不希望列表的接口中充斥著各種不同的遍歷操作。有時(shí)還可能需要在同一個(gè)列表上同時(shí)進(jìn)行多個(gè)遍歷。迭代器模式可以幫助你解決所有這些問題。這一個(gè)模式的關(guān)鍵思想市將對(duì)列表的訪問和遍歷從列表對(duì)象中分離出來并放入一個(gè)迭代器對(duì)象中,迭代器類定義了一個(gè)訪問該列表元素的接口,迭代器對(duì)象負(fù)責(zé)跟蹤當(dāng)前的元素,即他知道那些元素已經(jīng)遍歷過了。在實(shí)例化列表迭代器之前,必須提供待遍歷的列表,一旦有了該列表迭代器的實(shí)例,就可以順序訪問該列表的各個(gè)元素。CurrentItem操作返回列表中得當(dāng)前元素,F(xiàn)irst操作初始化迭代器,使當(dāng)前元素指向列表的第一個(gè)元素,Next操作將當(dāng)前元素指針向前推進(jìn)一步,指向下一個(gè)元素,而IsDone檢查是否已經(jīng)越過最后一個(gè)元素,也就是完成了這次遍歷。
例如常見的電視,可以定義一個(gè) 遙控器的,每個(gè)工廠生產(chǎn)的電視機(jī)都有配套的遙控器,這有點(diǎn)像抽象工廠模式,但是現(xiàn)在不是說抽象工廠模式,而說的重點(diǎn)是迭代器模式,電視的頻道為Item,每個(gè)遙控器都會(huì)有遍歷的功能,用以遍歷所有的頻道。如下圖所示,
適用性:
l         訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露他的內(nèi)部表示。
l         支持對(duì)句和對(duì)象的多遍遍歷。
l         為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口。
1電視頻道迭代器
參與者:
       Iterator:迭代器定義訪問和遍歷元素的接口。
       ConcreteIterator(Controller):具體迭代器實(shí)現(xiàn)迭代器接口,對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置。
       AggregateTelevation:聚合定義了創(chuàng)建相應(yīng)迭代器對(duì)象的接口。
       ConcreteAggregate(HaierTV):具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例。
協(xié)作關(guān)系:ConcreteIterator跟蹤聚合中的當(dāng)前對(duì)象,并能夠計(jì)算出待遍歷的后繼對(duì)象。

使用迭代器的好處:
1.         他支持以不同的方式遍歷一個(gè)聚合, 復(fù)雜的聚合可用多種方式進(jìn)行遍歷。
2.         迭代器簡化了聚合的接口 有了迭代器的遍歷接口,聚合本身就不需要類似的遍歷接口了,這樣就簡化了聚合的接口。
3.         在同一個(gè)聚合上可以有多個(gè)遍歷 每個(gè)迭代器保持它自己的遍歷狀態(tài)。因此你可以同時(shí)進(jìn)行多個(gè)遍歷。
在本例子中,Television定義了一個(gè)返回各個(gè)頻道列表的接口,這實(shí)際上是一個(gè)工廠方法,只是生產(chǎn)出來的產(chǎn)品所屬的類型支持Iterator的操作。
具體的代碼如下所示:
Iterator接口:
package iterator;
public interface Iterator{
    public Item first();
    public Item next();
    public boolean isDone();
    public Item currentItem();
}
Controller類實(shí)現(xiàn)了Iterator接口。
package iterator;
import java.util.Vector;
public class Controller implements Iterator{
    private int current =0;
    Vector channel;
    public Controller(Vector v){
       channel = v;
    }
    public Item first(){
       current = 0;
       return (Item)channel.get(current);
    }
    public Item next(){
       current ++;
       return (Item)channel.get(current);
    }
    public Item currentItem(){
       return (Item)channel.get(current);
    }
    public boolean isDone(){
       return current>= channel.size()-1;
    }
}
Television接口:
package iterator;
import java.util.Vector;
public interface Television{
    public Iterator createIterator();
    public Vector getChannel();
}
HaierTV類實(shí)現(xiàn)了Television接口。
package iterator;
import java.util.Vector;
public class HaierTV implements Television{
    private Vector channel;
    public HaierTV(){
       channel = new Vector();
       channel.addElement(new Item("channel 1"));
       channel.addElement(new Item("channel 2"));
       channel.addElement(new Item("channel 3"));
       channel.addElement(new Item("channel 4"));
       channel.addElement(new Item("channel 5"));
       channel.addElement(new Item("channel 6"));
       channel.addElement(new Item("channel 7"));
    }
    public Vector getChannel(){
       return channel;
    }
    public Iterator createIterator(){
       return new Controller(channel);
    }
}
Client客戶端:
package iterator;
public class Client{
    public static void main(String[] args){
       Television tv = new HaierTV();
       Iterator it =tv.createIterator();
       System.out.println(it.first().getName());
       while(!it.isDone()){
           System.out.println(it.next().getName());
       }
    }
}
Item類的接口:
package iterator;
public class Item{
    private String name;
    public Item(String aName){
       name = aName;
    }
    public String getName(){
       return name;
    }
}
總結(jié):Iterator模式提供了一個(gè)訪問聚合數(shù)據(jù)的簡單思路,并支持多個(gè)迭代器同時(shí)訪問。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品视频偷伦精品视频 | 国产在线精品一区二区 | 久久狠狠 | 黑人精品欧美一区二区蜜桃 | 精品精品 | 青青久久| 一区在线视频 | 欧美一区二区三区在线视频 | 亚洲精品久久久一区二区三区 | 亚洲精品久久国产高清情趣图文 | 午夜影院在线观看视频 | 香蕉视频1024 | aaaa一级毛片 | www.久| 亚洲国产午夜 | 日日夜夜精品视频 | 草草网| 日韩有码一区 | 国产激情 | 精品毛片在线观看 | 91观看 | 成人一区二区三区在线 | 日韩免费中文字幕 | 青青草免费在线视频 | 成人免费网站www网站高清 | 婷婷五月色综合 | 久久亚洲国产 | 国产精品不卡一区二区三区 | 日韩三级电影在线看 | 911网站大全在线观看 | 国产免费黄网 | 做a网站| 2018国产大陆天天弄 | 日韩精品一区在线观看 | 国产精品99久久久久 | 男女羞羞视频在线看 | 国产欧美一区二区三区久久人妖 | 国产成人精品福利 | 中文字幕在线视频观看 | 午夜无码国产理论在线 | 欧美区在线 |