迭代器模式(Iterator)

一、迭代器模式介绍

迭代器模式:提供一种方法顺序的访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

一般情况,我们自己开发时很少自定义迭代器,因为java本身已经把迭代器做到内部中了(比如:常用的list和set中都内置了迭代器)。

当然,如果真有这种需求需要我们自定义迭代器的话,可以参考jdk的迭代器实现方式来实现自己的迭代器。

迭代器是可以从前往后,或者从后往前遍历的。

为遍历不同聚集结构提供如:开始,下一个,是否有下一个,是否结束,当前哪一个等等的一个统一接口。

迭代器模式UML图:

聚集类:Aggregate(抽象类)和ConcreteAggregate(具体聚集类)表示聚集类,是用来存储迭代器的数据。

在Aggregate(抽象类)中有一个CreateIterator方法,用来获取迭代器

迭代器:迭代器用来为聚集类提供服务,提供了一系列访问聚集类对象元素的方法。

二、模拟迭代器的实现

首先定义一个迭代器的抽象,这里使用接口定义


1

2

3

4

5

6

7

8

9

10

//迭代器接口

public interface MyIterator {

    void first();//将游标指向第一个元素

    void next();//将游标指向下一个元素

    boolean hasNext();//判断是否有下一个元素

    

    boolean isFirst();//判断是否是第一个元素

    boolean isLast();//判断是否是最后一个元素

    Object getCurrentObj();//获取当前对象

}

然后自定一个一个聚集类,这里直接使用一个class来定义了。在聚集类内部,使用内部类的方式来定义迭代器的具体实现。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

import java.util.ArrayList;

import java.util.List;

//自定义聚集类

public class ConcreteMyAggregate {

    private List<Object> list = new ArrayList<>();

    public void addObject(Object obj){

        this.list.add(obj);

    }

    public void removeObject(Object obj){

        this.list.remove(obj);

    }

    public List<Object> getList() {

        return list;

    }

    public void setList(List<Object> list) {

        this.list = list;

    }

    //获得迭代器

    public MyIterator createIterator(){

        return new ConcreteIterator();

    }

    

    //使用内部类来定义迭代器,好处就是可以直接使用外部类的属性

    private class ConcreteIterator implements MyIterator{

        private int cursor;//定义一个迭代器游标

        @Override

        public void first() {

            cursor = 0;

        }

        @Override

        public void next() {

            if (cursor<list.size()) {

                cursor++;

            }

        }

        @Override

        public boolean hasNext() {

            //如果游标<list的大小,则说明还有下一个

            if (cursor<list.size()) {

                return true;

            }

            return false;

        }

        @Override

        public boolean isFirst() {

            return cursor==0?true:false;

        }

        @Override

        public boolean isLast() {

            //判断游标是否是容器的最后一个

            return cursor==(list.size()-1)?true:false;

        }

        @Override

        public Object getCurrentObj() {

            return list.get(cursor);//获取当前游标指向的元素

        }

    }

    

}

客户端测试代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

public static void main(String[] args) {

    ConcreteMyAggregate cma = new ConcreteMyAggregate();

    cma.addObject("111");

    cma.addObject("222");

    cma.addObject("333");

    cma.addObject("444");

       

    MyIterator iterator = cma.createIterator();

    cma.removeObject("111");//如果删除一个元素的话,迭代的时候也同样会被删除

    while (iterator.hasNext()) {

        System.out.println(iterator.getCurrentObj());//获取当前对象

        iterator.next();//将游标向下移

    }

}

测试结果如下:

222

333

444

来自为知笔记(Wiz)

时间: 2024-12-14 05:57:00

迭代器模式(Iterator)的相关文章

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 迭代器模式(iterator pattern) 详解

迭代器模式(iterator pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序访问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包含hasNext()方法和next()方法; 不同聚合对象的具体的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator in

设计模式 - 迭代器模式(iterator pattern) 扩展 详解

迭代器模式(iterator pattern) 扩展 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式-Java迭代器: http://blog.csdn.net/caroline_wendy/article/details/35268931 扩展迭代器模式, 添加一个Hashtable存储的类. 具体方法: 1. Hashtable的类, 包含创建value()的迭代器(iterator). /** * @time 2014年6月27日

二十四种设计模式:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现在要提供一种方法顺序地访问这个聚合对象中的各个元素. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Iterator { /// <summary>

设计模式入门之迭代器模式Iterator

迭代器模式定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部实现 迭代器模式的结构和说明 Iterator::迭代器接口.定义访问和遍历元素的接口 ConcreteIterator:具体的迭代器实现对象.实现对聚合对象的遍历,并跟踪遍历时的当前位置 Aggregate:聚合对象.定义创建相应迭代器对象的接口 ConcreteAggregate:具体聚合对象.实现创建相应的迭代器对象 实例:一个公司,工资列表是用List实现的,后收购一家公司,工资列表是用Array实现

设计模式 - 迭代器模式(iterator pattern) 具体解释

迭代器模式(iterator pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 迭代器模式(iterator pattern) : 提供一种方法顺序訪问一个聚合对象中的各个元素, 而又不暴露其内部的表示; 建立迭代器接口(iterator interface), 包括hasNext()方法和next()方法; 不同聚合对象的详细的迭代器(concrete iterator), 继承(implements)迭代器接口(iterator

16.迭代器模式(Iterator Pattern)

using System; namespace ConsoleApplication9 { class Program { /// <summary> /// 迭代器模式提供了一种方法顺序访问一个聚合对象(理解为集合对象)中各个元素, /// 而又无需暴露该对象的内部表示,这样既可以做到不暴露集合的内部结构, /// 又可让外部代码透明地访问集合内部的数据. /// </summary> /// <param name="args"></par

用最简单的例子理解迭代器模式(Iterator Pattern)

迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装到一个接口中. public interface IIterator { void First(); string Next(); bool IsDone(); string Current(); } 在现实场景中,迭代的方式可能有很多种,先实现一种迭代方式,实现IIterator接口. publi

设计模式之迭代器模式(Iterator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,

学习笔记——迭代器模式Iterator

迭代器模式,使用很多,但是很少实现.常用的集合都支持迭代器. 集合中的CreateIterator()可用于创建自己的迭代器,在里面通过调用迭代器的构造函数Iterator(Aggregate)来绑定自己到迭代器中,如果不使用此方法,也可以在场景中直接new Iterator(Aggregate)来得到一个迭代器.迭代器中的接口First()等其实本质都是操作引用的Aggregate对象实现的.好处在于不用集合自己来写迭代方法,一是可以复用迭代器,减少每种集合都去造轮子,二是看起减少了集合的接口