第15章 迭代器模式(Iterator Pattern)

原文 第15章 迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)

 

   概述:

 

        在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

        提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。[GOF 《设计模式》]

 

   结构图:

 

    简单示例:可能中间对象引用的地方有点绕,但是写得很精髓


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

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

 /// <summary>

    /// 抽象迭代器

    /// </summary>

    public interface Iterator

    {

        object GetCurrentItem();//当前项

        bool MoveNext();//是否遍历完

        void Next();//下一个

    }

    /// <summary>

    /// 具体迭代器

    /// </summary>

    public class ConcreteTerator : Iterator

    {

        public ConcreteList list;

        int index = 0;

        public ConcreteTerator(ConcreteList list)

        {

            this.list = list;

        }

        public bool MoveNext()

        {

            if (index < list.Length)

            {

                return true;

            }

            else

            {

                return false;

 

            }

        }

 

        public object GetCurrentItem()

        {

           return list.GetItem(index);

        }

        public void Next()

        {

            index++;

        }

    }

 

    /// <summary>

    /// 抽象聚集类

    /// </summary>

    public interface IList

    {

        //获取迭代器

        Iterator GetTerator();

 

    }

    /// <summary>

    /// 具体聚集类

    /// </summary>

    public class ConcreteList : IList

    {

        //这里就假设个Int数组对象

        public int[] list

        {

            get;

            set;

        }

        public int Length

        {

            get

            {

                return list.Length;

            }

        }

        public object GetItem(int i)

        {

          return  list[i];

        }

        public Iterator GetTerator()

        {

            //把本身传入到迭代器

            return new ConcreteTerator(this);

        }

    }

     

    //client

    class Program

    {

        static void Main(string[] args)

        {

            ConcreteList list = new ConcreteList();

            list.list = new int[5] { 1, 2, 3, 4, 5 };

            Iterator terator = list.GetTerator();

            while (terator.MoveNext())

            {

                Console.WriteLine(terator.GetCurrentItem());

                terator.Next();

            }

            Console.ReadLine();

        }

    }

 

     效果:

 

    1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

    2.迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

    3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

 

     适用场景:

 

 

    1.访问一个聚合对象的内容而无需暴露它的内部表示。

    2.支持对聚合对象的多种遍历。

    3.为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。

    

设计模式系列文章http://www.diyibk.com/post/39.html

时间: 2024-11-30 03:47:23

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

解读设计模式----迭代器模式(Iterator Pattern)

一.你在开发中使用过迭代吗? 当你在使用JavaScript开发客户端应用的时候使用过for...in吗? 1<script type="text/javascript"> 2var obj; 3useForIn = function () 4{ 5 obj = (0,1,2,3,4,5,6,7,8,9); 6 for(var o in obj) 7 { 8 document.write(o); 9 } 10} 11</script> 当你在.NET Frame

设计模式 ( 十四 ) 迭代器模式Iterator(对象行为型)

1.概述 类中的面向对象编程封装应用逻辑.类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态.单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合. 集合不一定是均一的.图形用户界面框架中的 Window 对象可以收集任意数量的控制对象 - Menu.Slider 和 Button.并且,集合的实现可以有多种方式:PHP 数字是一个集合,但也是一个散列表,一个链接列表,一个堆栈以及队列. 例子1:电视遥控器的频道遍历 2.问题 如何操纵任意的对象集合?  如一个列表(Li

设计模式之禅之设计模式-迭代器模式

一:迭代器模式的定义        --->迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发        --->它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节.        --->迭代器是为容器服务的,那什么是容器呢? 能容纳对象的所有类型都可以称之为容器,例如Collection集合类型.Set类型等,迭代器模式就是为解决遍历这些容器中的元素而诞生的        --->迭

深入理解JavaScript系列(35):设计模式之迭代器模式详解

 这篇文章主要介绍了深入理解JavaScript系列(35):设计模式之迭代器模式详解,迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示,需要的朋友可以参考下     介绍 迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示. 迭代器的几个特点是: 1.访问一个聚合对象的内容而无需暴露它的内部表示. 2.为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作. 3.遍历的同

.NET设计模式-迭代器模式(Iterator Pattern)

概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据.面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责.Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据. 意图 提供一种方法顺序访问一个聚合对象中

第18章 备忘录模式(Memento Pattern)

原文  第18章 备忘录模式(Memento Pattern) 备忘录模式         概述: 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 定义(源于GoF<设计模式>):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态.       结构图:        代码举例: 1 2 3 4 5 6 7 8 9 10

第23章 访问者模式(Visitor Pattern)

原文 第23章 访问者模式(Visitor Pattern) 访问者模式        导读:访问者模式是我个人认为所有行为模式中最为复杂的一种模式了,这个模式可能看一遍会看不懂,我也翻了好几个例子,依然不能很好的理解访问者模式的核心.下面这个例子是来源于大话设计模式中的例子,稍作了修改!后续如果我有更好的例子或者想法我会对本章进行完善.       概述:       一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作(神一般的语言).    

第20章 状态模式(State Pattern)

原文 第20章 状态模式(State Pattern) 状态模式        概述:           当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.         状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.        意图:          允许一个对象在其内部状态改变时改变它的行为        结构图:                 举例:      

第12章 代理模式(Proxy Pattern)

原文   第12章 代理模式(Proxy Pattern) 代理模式   概述:   在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式.   结构图:     举例:       代练游戏,玩游戏,自己不想花时间去升级.委托给代练.   1 2 3 4 5 6 7 8 9 10 11 12 13 14