91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中的迭代器模式怎么實現

發布時間:2021-11-17 11:58:59 來源:億速云 閱讀:282 作者:小新 欄目:大數據

小編給大家分享一下java中的迭代器模式怎么實現,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

迭代器模式

迭代器模式用于順序訪問集合對象的元素,而不需要知道集合對象的底層表示。Java和.Net等語言已經將迭代器作為其內部語法元素,比如在C#中,集合對象只需要實現IEnumberable接口,然后就可以用foreach來遍歷了。 迭代器模式提示我們要從使用者的角度考慮如何設計接口,如何對外提供訪問內部對象的方式。即便我們組織的對象系統內部結構很復雜,但對于客戶程序而言最簡單的方式莫過于通過for /foreach循環依次遍歷,至于遍歷過程中的次序、分類篩選等則由目標類型自己封裝。

GOF對迭代器模式描述為: Provide a way to access the elements of an aggregate objectsequentially without exposing its underlying representation. — Design Patterns : Elements of Reusable Object-Oriented Software

UML類圖: java中的迭代器模式怎么實現

代碼實現

//迭代器接口
public interface IIterator<T>
{
    T Next();
    bool HasNext();
}
//具體迭代器
public class ConcreteIterator<T> : IIterator<T>
{
    private ConcreteAggretate<T> Aggretate; //成員變量,關聯關系
    private int cursor = 0;
    public ConcreteIterator(ConcreteAggretate<T> agg)
    {
        this.Aggretate = agg;
    }
    public bool HasNext()
    {
        return !(cursor >= Aggretate.Size);
    }

    public T Next()
    {
        if (HasNext())
        {
            return Aggretate.GetELement(cursor++);
        }
        else
        {
            return default(T);
        }

    }
}
//聚合接口
public interface IAggretate<T>
{
    public void Add(T obj);
    public void Remove(T obj);
    public int Size { get; }
    public T GetELement(int index);
    public IIterator<T> GetIterator();
}
//具體聚合
public class ConcreteAggretate<T> : IAggretate<T>
{
    private List<T> list = new List<T>();  //
    public void Add(T obj)
    {
        list.Add(obj);
    }

    public void Remove(T obj)
    {
        list.Remove(obj);
    }

    public IIterator<T> GetIterator()
    {
        return new ConcreteIterator<T>(this);  //在局部方法中new實例,屬依賴關系
    }

    public int Size
    {
        get
        {
            return list.Count;
        }
    }

    public T GetELement(int index)
    {
        return list[index];
    }
}

調用者代碼:

IAggretate<int> aggretate = new ConcreteAggretate<int>();
aggretate.Add(9);
aggretate.Add(8);
aggretate.Add(7);
IIterator<int> iterator = aggretate.GetIterator();
while (iterator.HasNext())
{
    Console.WriteLine(iterator.Next());
}

基于IEnumerable的實現

以上便是經典的迭代器模式的實現,這種模式給聚合對象增加了一個創建其迭代器對象的方法,迭代器的抽象定義和具體迭代器類型都作為一個額外的對象存在。 實際上C#已內置了對迭代器模式的支持,只需要實現IEnumerable接口即可,不再需要從0開始,少了很多代碼量:

public class ConcreteAggretate<T> : IEnumerable<T>
{
    private List<T> list = new List<T>();
    public void Add(T obj)
    {
        list.Add(obj);
    }

    public void Remove(T obj)
    {
        list.Remove(obj);
    }

    public IEnumerator<T> GetEnumerator()
    {
        foreach (var item in list)
        {
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

使用foreach遍歷IEnumerable接口

var aggretate = ConcreteAggretate<int>();
aggretate.Add(9);
aggretate.Add(8);
aggretate.Add(7);

foreach (var item in aggretate)
{
    Console.WriteLine(item);
}

使用場景

  • 對象內部結構比較復雜,為了讓調用者可以輕松地訪問,同時不需要暴露其內部結構;

  • 需要為聚合對象提供多種遍歷方式;

  • 為遍歷不同的聚合結構提供一個統一的接口;

迭代器模式的優缺點

優點

  • 迭代器支持以不同的方式遍歷一個聚合對象,而且在同一個聚合上可以添加多個具有不同遍歷方式的迭代器;

  • 迭代器簡化了聚合類的遍歷;

  • 迭代器模式可以方便地增加新的聚合類和迭代器類,無須修改原有代碼。

缺點 迭代器模式通過將存儲數據和遍歷數據的職責分離,為封裝集合地復雜性、隔離變化提供了極大的遍歷,但這種方式也有其固有的缺點:每次 增加新的聚合類都需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性。

以上是“java中的迭代器模式怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

麻栗坡县| 兰坪| 光山县| 泽普县| 文登市| 临夏县| 临湘市| 汶上县| 云梦县| 咸阳市| 林西县| 故城县| 梨树县| 扶绥县| 中江县| 乐平市| 兴业县| 大荔县| 航空| 武宁县| 安吉县| 绥宁县| 沾益县| 和龙市| 荆门市| 郓城县| 枣阳市| 望奎县| 杭锦旗| 马公市| 南丹县| 瓦房店市| 饶阳县| 阿合奇县| 剑河县| 三门峡市| 江都市| 元朗区| 晋江市| 镇巴县| 土默特左旗|