最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net行為型設(shè)計(jì)模式之迭代器模式(Iterator)

 更新時(shí)間:2022年05月26日 09:30:23   作者:springsnow  
這篇文章介紹了.Net行為型設(shè)計(jì)模式之迭代器模式(Iterator),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、動(dòng)機(jī)(Motivate)

在軟件構(gòu)建過(guò)程中,集合對(duì)象內(nèi)部結(jié)構(gòu)常常變化各異。但對(duì)于這些集合對(duì)象,我們希望在不暴露其內(nèi)部結(jié)構(gòu)的同時(shí),可以讓外部客戶代碼透明地訪問(wèn)其中包含的元素;同時(shí)這種“透明遍歷”也為“同一種算法在多種集合對(duì)象上進(jìn)行操作”提供了可能。
使用面向?qū)ο蠹夹g(shù)將這種遍歷機(jī)制抽象為“迭代器對(duì)象”為“應(yīng)對(duì)變化中的集合對(duì)象”提供了一種優(yōu)雅的方式。

二、意圖(Intent)

提供一種方法順序訪問(wèn)一個(gè)聚合對(duì)象中的各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。                                 ——《設(shè)計(jì)模式》GoF

三、結(jié)構(gòu)圖

四、模式的組成

從迭代器模式的結(jié)構(gòu)圖可以看出,它涉及到四個(gè)角色,它們分別是:
(1)、抽象迭代器(Iterator):抽象迭代器定義了訪問(wèn)和遍歷元素的接口,一般聲明如下方法:用于獲取第一個(gè)元素的first(),用于訪問(wèn)下一個(gè)元素的next(),用于判斷是否還有下一個(gè)元素的hasNext(),用于獲取當(dāng)前元素的currentItem(),在其子類中將實(shí)現(xiàn)這些方法。
(2)、具體迭代器(ConcreteIterator):具體迭代器實(shí)現(xiàn)了抽象迭代器接口,完成對(duì)集合對(duì)象的遍歷,同時(shí)在對(duì)聚合進(jìn)行遍歷時(shí)跟蹤其當(dāng)前位置。
(3)、抽象聚合類(Aggregate):抽象聚合類用于存儲(chǔ)對(duì)象,并定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口,聲明一個(gè)createIterator()方法用于創(chuàng)建一個(gè)迭代器對(duì)象。
(4)、具體聚合類(ConcreteAggregate):具體聚合類實(shí)現(xiàn)了創(chuàng)建相應(yīng)迭代器的接口,實(shí)現(xiàn)了在抽象聚合類中聲明的createIterator()方法,并返回一個(gè)與該具體聚合相對(duì)應(yīng)的具體迭代器ConcreteIterator實(shí)例。

五、迭代器模式的代碼實(shí)現(xiàn)

迭代器模式在現(xiàn)實(shí)生活中也有類似的例子,比如:在部隊(duì)中,我們可以讓某一隊(duì)伍當(dāng)中的某人出列,或者讓隊(duì)列里面的每個(gè)人依次報(bào)名,其實(shí)這個(gè)過(guò)程就是一個(gè)遍歷的過(guò)程。

// 客戶端(Client)
static void Main(string[] args)
{
    Iterator iterator;
    ITroopQueue list = new ConcreteTroopQueue();
    iterator = list.GetIterator();

    while (iterator.MoveNext())
    {
        string ren = (string)iterator.GetCurrent();
        Console.WriteLine(ren);
        iterator.Next();
    }

    Console.Read();
}

// 部隊(duì)隊(duì)列的抽象聚合類--該類型相當(dāng)于抽象聚合類Aggregate
public interface ITroopQueue
{
    Iterator GetIterator();
}

// 迭代器抽象類
public interface Iterator
{
    bool MoveNext();
    Object GetCurrent();
    void Next();
    void Reset();
}

//部隊(duì)隊(duì)列具體聚合類--相當(dāng)于具體聚合類ConcreteAggregate
public sealed class ConcreteTroopQueue : ITroopQueue
{
    private string[] collection;

    public ConcreteTroopQueue()
    {
        collection = new string[] { "黃飛鴻", "方世玉", "洪熙官", "嚴(yán)詠春" };
    }

    public Iterator GetIterator()
    {
        return new ConcreteIterator(this);
    }

    public int Length
    {
        get { return collection.Length; }
    }

    public string GetElement(int index)
    {
        return collection[index];
    }
}

// 具體迭代器類
public sealed class ConcreteIterator : Iterator
{
    // 迭代器要集合對(duì)象進(jìn)行遍歷操作,自然就需要引用集合對(duì)象
    private ConcreteTroopQueue _list;
    private int _index;

    public ConcreteIterator(ConcreteTroopQueue list)
    {
        _list = list;
        _index = 0;
    }

    public bool MoveNext()
    {
        if (_index < _list.Length)
        {
            return true;
        }
        return false;
    }

    public Object GetCurrent()
    {
        return _list.GetElement(_index);
    }

    public void Reset()
    {
        _index = 0;
    }

    public void Next()
    {
        if (_index < _list.Length)
        {
            _index++;
        }

    }
}

六、迭代器模式的實(shí)現(xiàn)要點(diǎn):

1、迭代抽象:訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。
2、迭代多態(tài):為遍歷不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。
3、迭代器的健壯性考慮:遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu),會(huì)導(dǎo)致問(wèn)題。

迭代器模式的優(yōu)點(diǎn):

(1)、迭代器模式使得訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示,即迭代抽象。
(2)、迭代器模式為遍歷不同的集合結(jié)構(gòu)提供了一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上進(jìn)行操作。

迭代器模式的缺點(diǎn):

迭代器模式在遍歷的同時(shí)更改迭代器所在的集合結(jié)構(gòu)會(huì)導(dǎo)致出現(xiàn)異常。所以使用foreach語(yǔ)句只能在對(duì)集合進(jìn)行遍歷,不能在遍歷的同時(shí)更改集合中的元素。

迭代器模式的使用場(chǎng)景:

(1)、訪問(wèn)一個(gè)聚合對(duì)象的內(nèi)容而無(wú)需暴露它的內(nèi)部表示。
(2)、支持對(duì)聚合對(duì)象的多種遍歷。
(3)、為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口(即, 支持多態(tài)迭代)。

七、.NET 中迭代器模式的實(shí)現(xiàn)

在mscorlib程序集里有這樣一個(gè)命名空間,該命名空間就是:System.Collections,在該命名空間里面早已有了迭代器模式的實(shí)現(xiàn)。對(duì)于聚集接口和迭代器接口已經(jīng)存在了,其中IEnumerator扮演的就是迭代器的角色,它的實(shí)現(xiàn)如下:

public interface IEnumerator
 {
      object Current
      {
           get;
      }

     bool MoveNext();

     void Reset();
 }

屬性Current返回當(dāng)前集合中的元素,Reset()方法恢復(fù)初始化指向的位置,MoveNext()方法返回值true表示迭代器成功前進(jìn)到集合中的下一個(gè)元素,返回值false表示已經(jīng)位于集合的末尾。能夠提供元素遍歷的集合對(duì)象,在.Net中都實(shí)現(xiàn)了IEnumerator接口。
IEnumerable則扮演的就是抽象聚集的角色,只有一個(gè)GetEnumerator()方法,如果集合對(duì)象需要具備跌代遍歷的功能,就必須實(shí)現(xiàn)該接口。

public interface IEnumerable
{
    IEumerator GetEnumerator();
}

抽象聚合角色(Aggregate)和抽象迭代器角色(Iterator)分別是IEnumerable接口和IEnumerator接口,具體聚合角色(ConcreteAggregate)有Queue類型, BitArray等類型。

到此這篇關(guān)于.Net行為型設(shè)計(jì)模式之迭代器模式(Iterator)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 初識(shí) ASP.NET Membership 用戶管理

    初識(shí) ASP.NET Membership 用戶管理

    Membership 是用做用戶管理,進(jìn)行身份認(rèn)證使用的。通過(guò)ASP.NET Membership,我們可以創(chuàng)建用戶、刪除用戶和編輯用戶屬性。所以這是一個(gè)實(shí)現(xiàn)登錄相關(guān)控件的底層框架。
    2016-04-04
  • ASP.NET?Core基礎(chǔ)之Main方法講解

    ASP.NET?Core基礎(chǔ)之Main方法講解

    這篇文章介紹了ASP.NET?Core基礎(chǔ)之Main方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • .NET?6全新配置對(duì)象ConfigurationManager介紹

    .NET?6全新配置對(duì)象ConfigurationManager介紹

    這篇文章介紹了.NET?6全新配置對(duì)象ConfigurationManager,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • .Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge)

    .Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge)

    這篇文章介紹了.Net結(jié)構(gòu)型設(shè)計(jì)模式之橋接模式(Bridge),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • ewebeditor在.net的使用方法

    ewebeditor在.net的使用方法

    ewebeditor在.net的使用方法...
    2006-11-11
  • WCF入門需要掌握的基礎(chǔ)知識(shí)

    WCF入門需要掌握的基礎(chǔ)知識(shí)

    這篇文章介紹了WCF入門需要掌握的基礎(chǔ)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET Core MVC中的控制器(Controller)介紹

    ASP.NET Core MVC中的控制器(Controller)介紹

    這篇文章介紹了ASP.NET Core MVC中的控制器(Controller),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#使用正則表達(dá)式實(shí)例

    C#使用正則表達(dá)式實(shí)例

    正則表達(dá)式(regular expression)是用來(lái)快速、高效地處理文本數(shù)據(jù)的工具。被處理的文本可以小到一個(gè)電子郵件地址,也可以大到一個(gè)多行文本輸入框中的文本數(shù)據(jù)。正則表達(dá)式不僅可用來(lái)確認(rèn)一段文本是否與一個(gè)預(yù)定義的模式相匹配,還可以用于從文本中抽取符合某一模式的數(shù)據(jù)。
    2008-04-04
  • ASP.NET MVC使用區(qū)域(Area)功能

    ASP.NET MVC使用區(qū)域(Area)功能

    這篇文章介紹了ASP.NET MVC使用區(qū)域(Area)功能的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Asp.net請(qǐng)求處理之管道處理介紹

    Asp.net請(qǐng)求處理之管道處理介紹

    在了解Asp.net請(qǐng)求處理流程的過(guò)程中,個(gè)人認(rèn)為有必要從源代碼的角度來(lái)了解asp.net管道是怎么實(shí)現(xiàn)的,需要的朋友可以參考下
    2012-11-11

最新評(píng)論

金山区| 龙岩市| 怀化市| 泸西县| 乌拉特后旗| 容城县| 高碑店市| 渭源县| 高平市| 鲜城| 岳普湖县| 巴马| 临颍县| 湖北省| 长治县| 耿马| 吕梁市| 南木林县| 罗甸县| 监利县| 离岛区| 大英县| 辉南县| 岑溪市| 壶关县| 石柱| 鲁山县| 云龙县| 成武县| 遵义市| 昔阳县| 宜君县| 云阳县| 玉田县| 青浦区| 三台县| 遵化市| 朝阳市| 沈丘县| 晋中市| 福建省|