迭代器模式(Iterator)

1.    定义

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

2.      UML 类图

 

3.      结构代码

// Iterator pattern -- Structural example

using System;

using System.Collections;

 

namespace DoFactory.GangOfFour.Iterator.Structural

{

    /// <summary>

    /// MainApp startup class for Structural

    /// Iterator Design Pattern.

    /// </summary>

    class MainApp

    {

        /// <summary>

        /// Entry point into console application.

        /// </summary>

        static void Main()

        {

            ConcreteAggregate a = new ConcreteAggregate();

            a[0] = "Item A";

            a[1] = "Item B";

            a[2] = "Item C";

            a[3] = "Item D";

 

            // Create Iterator and provide aggregate

            ConcreteIterator i = new ConcreteIterator(a);

 

            Console.WriteLine("Iterating over collection:");

 

            object item = i.First();

            while (item != null)

            {

                Console.WriteLine(item);

                item = i.Next();

            }

 

            // Wait for user

            Console.ReadKey();

        }

    }

 

    /// <summary>

    /// The 'Aggregate' abstract class

    /// </summary>

    abstract class Aggregate

    {

        public abstract Iterator CreateIterator();

    }

 

    /// <summary>

    /// The 'ConcreteAggregate' class

    /// </summary>

    class ConcreteAggregate : Aggregate

    {

        private ArrayList _items = new ArrayList();

 

        public override Iterator CreateIterator()

        {

            return new ConcreteIterator(this);

        }

 

        // Gets item count

        public int Count

        {

            get { return _items.Count; }

        }

 

        // Indexer

        public object this[int index]

        {

            get { return _items[index]; }

            set { _items.Insert(index, value); }

        }

    }

 

    /// <summary>

    /// The 'Iterator' abstract class

    /// </summary>

    abstract class Iterator

    {

        public abstract object First();

        public abstract object Next();

        public abstract bool IsDone();

        public abstract object CurrentItem();

    }

 

    /// <summary>

    /// The 'ConcreteIterator' class

    /// </summary>

    class ConcreteIterator : Iterator

    {

        private ConcreteAggregate _aggregate;

        private int _current = 0;

 

        // Constructor

        public ConcreteIterator(ConcreteAggregate aggregate)

        {

            this._aggregate = aggregate;

        }

 

        // Gets first iteration item

        public override object First()

        {

            return _aggregate[0];

        }

 

        // Gets next iteration item

        public override object Next()

        {

            object ret = null;

            if (_current < _aggregate.Count - 1)

            {

                ret = _aggregate[++_current];

            }

 

            return ret;

        }

 

        // Gets current iteration item

        public override object CurrentItem()

        {

            return _aggregate[_current];

        }

 

        // Gets whether iterations are complete

        public override bool IsDone()

        {

            return _current >= _aggregate.Count;

        }

    }

}


Output
Iterating over collection:
Item A
Item B
Item C
Item D

4.      实例代码

// Iterator pattern -- Real World example

using System;

using System.Collections;

 

namespace DoFactory.GangOfFour.Iterator.RealWorld

{

    /// <summary>

    /// MainApp startup class for Real-World

    /// Iterator Design Pattern.

    /// </summary>

    class MainApp

    {

        /// <summary>

        /// Entry point into console application.

        /// </summary>

        static void Main()

        {

            // Build a collection

            Collection collection = new Collection();

            collection[0] = new Item("Item 0");

            collection[1] = new Item("Item 1");

            collection[2] = new Item("Item 2");

            collection[3] = new Item("Item 3");

            collection[4] = new Item("Item 4");

            collection[5] = new Item("Item 5");

            collection[6] = new Item("Item 6");

            collection[7] = new Item("Item 7");

            collection[8] = new Item("Item 8");

 

            // Create iterator

            Iterator iterator = new Iterator(collection);

 

            // Skip every other item

            iterator.Step = 2;

 

            Console.WriteLine("Iterating over collection:");

 

            for (Item item = iterator.First();

                !iterator.IsDone; item = iterator.Next())

            {

                Console.WriteLine(item.Name);

            }

 

            // Wait for user

            Console.ReadKey();

        }

    }

 

    /// <summary>

    /// A collection item

    /// </summary>

    class Item

    {

        private string _name;

 

        // Constructor

        public Item(string name)

        {

            this._name = name;

        }

 

        // Gets name

        public string Name

        {

            get { return _name; }

        }

    }

 

    /// <summary>

    /// The 'Aggregate' interface

    /// </summary>

    interface IAbstractCollection

    {

        Iterator CreateIterator();

    }

 

    /// <summary>

    /// The 'ConcreteAggregate' class

    /// </summary>

    class Collection : IAbstractCollection

    {

        private ArrayList _items = new ArrayList();

 

        public Iterator CreateIterator()

        {

            return new Iterator(this);

        }

 

        // Gets item count

        public int Count

        {

            get { return _items.Count; }

        }

 

        // Indexer

        public object this[int index]

        {

            get { return _items[index]; }

            set { _items.Add(value); }

        }

    }

 

    /// <summary>

    /// The 'Iterator' interface

    /// </summary>

    interface IAbstractIterator

    {

        Item First();

        Item Next();

        bool IsDone { get; }

        Item CurrentItem { get; }

    }

 

    /// <summary>

    /// The 'ConcreteIterator' class

    /// </summary>

    class Iterator : IAbstractIterator

    {

        private Collection _collection;

        private int _current = 0;

        private int _step = 1;

 

        // Constructor

        public Iterator(Collection collection)

        {

            this._collection = collection;

        }

 

        // Gets first item

        public Item First()

        {

            _current = 0;

            return _collection[_current] as Item;

        }

 

        // Gets next item

        public Item Next()

        {

            _current += _step;

            if (!IsDone)

                return _collection[_current] as Item;

            else

                return null;

        }

 

        // Gets or sets stepsize

        public int Step

        {

            get { return _step; }

            set { _step = value; }

        }

 

        // Gets current iterator item

        public Item CurrentItem

        {

            get { return _collection[_current] as Item; }

        }

 

        // Gets whether iteration is complete

        public bool IsDone

        {

            get { return _current >= _collection.Count; }

        }

    }

}


Output
Iterating over collection:
Item 0
Item 2
Item 4
Item 6
Item 8

该文章来自:http://www.dofactory.com/Patterns/PatternIterator.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值