java设计模式迭代器模式_Java中的迭代器设计模式–示例教程
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;}}通道是一個簡單的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(); }現在我們的基本接口和核心類已經準備好,讓我們繼續實現collection類和迭代器。
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掃描程序類。
這就是迭代器模式的全部內容,我希望它會有所幫助并且易于理解。
翻譯自: https://www.javacodegeeks.com/2013/08/iterator-design-pattern-in-java-example-tutorial.html
java設計模式迭代器模式
總結
以上是生活随笔為你收集整理的java设计模式迭代器模式_Java中的迭代器设计模式–示例教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 创建一个坚固的备份系统
- 下一篇: REST:使用Controller端点?