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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java设计模式迭代器模式_Java中的迭代器设计模式–示例教程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java設(shè)計(jì)模式迭代器模式

迭代器模式是一種行為模式,它用于提供遍歷一組對(duì)象的標(biāo)準(zhǔn)方式。 Iterator模式在Java Collection Framework中得到了廣泛使用,其中Iterator接口提供了遍歷集合的方法。 根據(jù)GoF,迭代器設(shè)計(jì)模式的意圖是:

提供一種在不暴露其基礎(chǔ)表示的情況下訪(fǎng)問(wèn)聚合對(duì)象的元素的方法。

迭代器模式不僅涉及遍歷集合,我們還可以根據(jù)需求提供不同種類(lèi)的迭代器。 迭代器模式通過(guò)集合隱藏了遍歷的實(shí)際實(shí)現(xiàn),而客戶(hù)端程序僅使用迭代器方法。

讓我們通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)了解這種模式。 假設(shè)我們有一個(gè)廣播頻道列表,并且客戶(hù)端程序要逐個(gè)或根據(jù)頻道類(lèi)型遍歷它們,例如,某些客戶(hù)端程序只對(duì)英語(yǔ)頻道感興趣,并且只想處理它們,而沒(méi)有想要處理其他類(lèi)型的渠道。

因此,我們可以向客戶(hù)提供渠道的集合,讓他們編寫(xiě)邏輯來(lái)遍歷渠道并決定是否進(jìn)行處理。 但是此解決方案存在很多問(wèn)題,例如客戶(hù)端必須提出遍歷的邏輯。 我們無(wú)法確保客戶(hù)端邏輯正確,并且如果客戶(hù)端數(shù)量增加,則將很難維護(hù)。

在這里,我們可以使用Iterator模式,并根據(jù)通道類(lèi)型提供迭代。 我們應(yīng)該確保客戶(hù)端程序只能通過(guò)迭代器訪(fǎng)問(wèn)頻道列表。

實(shí)現(xiàn)的第一部分是為我們的collection和iterator接口定義協(xié)定。

ChannelTypeEnum.java

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

ChannelTypeEnum是Java枚舉 ,它定義所有不同類(lèi)型的通道。

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;}}

通道是一個(gè)簡(jiǎn)單的POJO類(lèi),具有頻率和通道類(lèi)型屬性。

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接口為我們的集合類(lèi)實(shí)現(xiàn)定義合同。 請(qǐng)注意,有一些方法可以添加和刪除通道,但是沒(méi)有方法可以返回通道列表,而有一個(gè)方法可以返回遍歷的迭代器。 ChannelIterator接口定義以下方法;

ChannelIterator.java

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

現(xiàn)在我們的基本接口和核心類(lèi)已經(jīng)準(zhǔn)備好,讓我們繼續(xù)實(shí)現(xiàn)collection類(lèi)和迭代器。

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;}} }

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

讓我們編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試類(lèi),以使用我們的集合和迭代器根據(jù)類(lèi)型遍歷通道的集合。

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;}}

當(dāng)我運(yùn)行上面的程序時(shí),它會(huì)產(chǎn)生以下輸出;

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

重要事項(xiàng)

  • 當(dāng)您想提供一種標(biāo)準(zhǔn)方法來(lái)迭代集合并從客戶(hù)端程序中隱藏實(shí)現(xiàn)邏輯時(shí),迭代器模式非常有用。
  • 迭代邏輯嵌入在集合本身中,它可以幫助客戶(hù)端程序輕松地對(duì)其進(jìn)行迭代。

JDK中的迭代器模式

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

這就是迭代器模式的全部?jī)?nèi)容,我希望它會(huì)有所幫助并且易于理解。

參考: Java中的迭代器設(shè)計(jì)模式– JCG合作伙伴 Pankaj Kumar在開(kāi)發(fā)人員食譜博客上的示例教程 。

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

java設(shè)計(jì)模式迭代器模式

總結(jié)

以上是生活随笔為你收集整理的java设计模式迭代器模式_Java中的迭代器设计模式–示例教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。