日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中的迭代器设计模式–示例教程

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中的迭代器设计模式–示例教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

迭代器模式是一種行為模式,用于提供遍歷一組對象的標準方式。 Iterator模式在Java Collection Framework中得到了廣泛使用,其中Iterator接口提供了遍歷集合的方法。 根據GoF,迭代器設計模式的意圖是:

提供一種在不暴露其基礎表示的情況下訪問聚合對象的元素的方法。

迭代器模式不僅涉及遍歷集合,我們還可以根據需求提供不同種類的迭代器。 迭代器模式通過集合隱藏了遍歷的實際實現,而客戶端程序僅使用迭代器方法。

讓我們通過一個簡單的例子來了解這種模式。 假設我們有一個廣播頻道列表,并且客戶端程序想要逐個或根據頻道類型遍歷它們,例如,某些客戶端程序只對英語頻道感興趣,并且只想處理它們,而沒有想要處理其他類型的渠道。

因此,我們可以向客戶提供渠道的集合,讓他們編寫邏輯來遍歷渠道并決定是否處理它們。 但是此解決方案存在很多問題,例如客戶端必須提出遍歷的邏輯。 我們無法確保客戶端邏輯正確,并且如果客戶端數量增加,那么將很難維護。

在這里,我們可以使用Iterator模式,并根據通道類型提供迭代。 我們應該確保客戶端程序只能通過迭代器訪問通道列表。

實現的第一部分是為我們的collection和iterator接口定義協定。

ChannelTypeEnum.java

package com.journaldev.design.iterator;public enum ChannelTypeEnum {ENGLISH, HINDI, FRENCH, ALL; }

ChannelTypeEnum是Java枚舉 ,它定義所有不同類型的通道。

Channel.java

package com.journaldev.design.iterator;public class Channel {private double frequency;private ChannelTypeEnum TYPE;public Channel(double freq, ChannelTypeEnum type){this.frequency=freq;this.TYPE=type;}public double getFrequency() {return frequency;}public ChannelTypeEnum getTYPE() {return TYPE;}@Overridepublic String toString(){return "Frequency="+this.frequency+", Type="+this.TYPE;}}

Channel是具有屬性頻率和通道類型的簡單POJO類。

ChannelCollection.java

package com.journaldev.design.iterator;public interface ChannelCollection {public void addChannel(Channel c);public void removeChannel(Channel c);public ChannelIterator iterator(ChannelTypeEnum type);}

ChannelCollection接口為我們的集合類實現定義合同。 請注意,有一些方法可以添加和刪除通道,但是沒有方法可以返回通道列表,而有一個方法可以返回遍歷的迭代器。 ChannelIterator接口定義以下方法;

ChannelIterator.java

package com.journaldev.design.iterator;public interface ChannelIterator {public boolean hasNext();public Channel next(); }

現在我們的基本接口和核心類已經準備好,讓我們繼續實現集合類和迭代器。

ChannelCollectionImpl.java

package com.journaldev.design.iterator;import java.util.ArrayList; import java.util.List;public class ChannelCollectionImpl implements ChannelCollection {private List<Channel> channelsList;public ChannelCollectionImpl() {channelsList = new ArrayList<>();}public void addChannel(Channel c) {this.channelsList.add(c);}public void removeChannel(Channel c) {this.channelsList.remove(c);}@Overridepublic ChannelIterator iterator(ChannelTypeEnum type) {return new ChannelIteratorImpl(type, this.channelsList);}private class ChannelIteratorImpl implements ChannelIterator {private ChannelTypeEnum type;private List<Channel> channels;private int position;public ChannelIteratorImpl(ChannelTypeEnum ty,List<Channel> channelsList) {this.type = ty;this.channels = channelsList;}@Overridepublic boolean hasNext() {while (position < channels.size()) {Channel c = channels.get(position);if (c.getTYPE().equals(type) || type.equals(ChannelTypeEnum.ALL)) {return true;} elseposition++;}return false;}@Overridepublic Channel next() {Channel c = channels.get(position);position++;return c;}} }

注意迭代器接口的內部類實現,以便任何其他集合都不能使用該實現。 集合類也遵循相同的方法,并且它們都具有Iterator接口的內部類實現。

讓我們編寫一個簡單的測試類,以使用我們的集合和迭代器根據類型遍歷通道的集合。

IteratorPatternTest.java

package com.journaldev.design.iterator;public class IteratorPatternTest {public static void main(String[] args) {ChannelCollection channels = populateChannels();ChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL);while (baseIterator.hasNext()) {Channel c = baseIterator.next();System.out.println(c.toString());}System.out.println("******");// Channel Type IteratorChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.ENGLISH);while (englishIterator.hasNext()) {Channel c = englishIterator.next();System.out.println(c.toString());}}private static ChannelCollection populateChannels() {ChannelCollection channels = new ChannelCollectionImpl();channels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(99.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH));channels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(102.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH));channels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH));channels.addChannel(new Channel(105.5, ChannelTypeEnum.HINDI));channels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH));return channels;}}

當我運行上面的程序時,它將產生以下輸出;

IteratorPatternTest.java

Frequency=98.5, Type=ENGLISH Frequency=99.5, Type=HINDI Frequency=100.5, Type=FRENCH Frequency=101.5, Type=ENGLISH Frequency=102.5, Type=HINDI Frequency=103.5, Type=FRENCH Frequency=104.5, Type=ENGLISH Frequency=105.5, Type=HINDI Frequency=106.5, Type=FRENCH ****** Frequency=98.5, Type=ENGLISH Frequency=101.5, Type=ENGLISH Frequency=104.5, Type=ENGLISH

重要事項

  • 當您想提供一種標準方法來遍歷集合并從客戶端程序中隱藏實現邏輯時,迭代器模式非常有用。
  • 迭代邏輯嵌入在集合本身中,它可以幫助客戶端程序輕松地對其進行迭代。

JDK中的迭代器模式

我們都知道Collection框架Iterator是迭代器模式實現的最佳示例,但您知道java.util.Scanner類也實現Iterator接口。 閱讀這篇文章以了解Java掃描程序類。

這就是迭代器模式的全部,我希望它是有用的并且易于理解。

參考: Java中的迭代器設計模式– JCG合作伙伴 Pankaj Kumar在開發人員食譜博客上的示例教程 。

翻譯自: https://www.javacodegeeks.com/2013/08/iterator-design-pattern-in-java-example-tutorial.html

總結

以上是生活随笔為你收集整理的Java中的迭代器设计模式–示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。