zoukankan      html  css  js  c++  java
  • 设计模式のIteratorPattern(迭代器模式)----行为模式

    一、产生背景

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

    二、实现方式

      迭代器模式参与者:

      ◊ Iterator:迭代器定义访问和遍历元素的接口

      ◊ ConcreteIterator

        ° 具体迭代器实现迭代器接口

        ° 对该聚合遍历时跟踪当前位置

      ◊ Aggregate:聚合定义创建Iterator对象的接口

      ◊ ConcreteAggregate:具体聚合,实现相应迭代器的接口,返回具体迭代器的一个适当的实例。

      在迭代器模式中,ConcreteAggregate通过Aggregate定义的接口得到Iterator,并且这是一个ConcreteIterator,该ConcreteIterator具体实现了对ConcreteAggregate的访问与遍历的方法。通过ConcreteIterator可以访问并使用集合中的元素。

    三、实例

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace IteratorPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcreteAggregate a = new ConcreteAggregate();
                a[0] = "Item A";
                a[1] = "Item B";
                a[2] = "Item C";
                a[3] = "Item D";
    
                ConcreteIterator i = new ConcreteIterator(a);
    
                Console.WriteLine("Iterating over collection:");
                object item = i.First();
                while (item != null)
                {
                    Console.WriteLine(item);
                    item = i.Next();
                }
    
                Console.Read();
            }
        }
    
        public abstract class Iterator
        {
            public abstract object First();
            public abstract object Next();
            public abstract bool IsDone();
            public abstract object CurrentItem();
        }
    
        public abstract class Aggregate
        {
            public abstract Iterator CreateIterator();
        }
    
        public class ConcreteAggregate : Aggregate
        {
            private ArrayList _items = new ArrayList();
    
            public override Iterator CreateIterator()
            {
                return new ConcreteIterator(this);
            }
    
            public int Count
            {
                get { return _items.Count; }
            }
    
            public object this[int index]
            {
                get { return _items[index]; }
                set { _items.Insert(index, value); }
            }
        }
    
        public class ConcreteIterator : Iterator
        {
            private ConcreteAggregate _aggregate;
            private int _current = 0;
    
            public ConcreteIterator(ConcreteAggregate aggregate)
            {
                this._aggregate = aggregate;
            }
    
            public override object First()
            {
                return _aggregate[0];
            }
    
            public override object Next()
            {
                object ret = null;
                if (_current < _aggregate.Count - 1)
                {
                    ret = _aggregate[++_current];
                }
    
                return ret;
            }
    
            public override object CurrentItem()
            {
                return _aggregate[_current];
            }
    
            public override bool IsDone()
            {
                return _current >= _aggregate.Count;
            }
        }
    }

    四、模式分析

    优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

  • 相关阅读:
    怎么把自己电脑上的文件传到服务器本地上
    查看hive中某个表中的数据、表结构及所在路径
    python2.7读汉字的时候出现乱码,如何解决
    如何连接服务器客户端
    java常用问题排查工具
    netty源码分析之一:server的启动
    java AQS 一:
    netty源码分析之二:accept请求
    java Resource
    二:基础概述netty
  • 原文地址:https://www.cnblogs.com/xietianjiao/p/8744545.html
Copyright © 2011-2022 走看看