当前位置: 首页 > news >正文

行为型模式 - 迭代器模式iterator

 

模式的定义与特点

     迭代器模式(iterator Pattern),为的提是可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

模式的优点

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

模式的缺点

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

using DesignPattern.ChainofResponsibilityPattern;
using DesignPattern.IteratorPatttern;
using DesignPattern.MementoPattern;
using DesignPattern.ObserverPattern;
using DesignPattern.VisitorPattern;
using System;
using System.Collections.Generic;

namespace DesignPattern
{
    internal class Program
    {
        static void Main(string[] args)
        {
            IteratorHelper();
        }

        #region Pattern - Iterator
        static void IteratorHelper()
        {
            ObjectRepository<string> _stringRepository = new ObjectRepository<string>();
            _stringRepository.AddObject("A");
            _stringRepository.AddObject("B");
            _stringRepository.AddObject("C");
            _stringRepository.AddObject(11.ToString());

            ObjectRepository<int> _intRepository = new ObjectRepository<int>();
            _intRepository.AddObject(-1);
            _intRepository.AddObject(10);
            _intRepository.AddObject(20);
            _intRepository.AddObject(30);


            for (Iterator<string> _iterator = _stringRepository.GetIterator(); _iterator.HasNext();)
            {
                Console.WriteLine("Object is: " + _iterator.Next());
            }

            Console.WriteLine("===================================================================");

            for (Iterator<int> _iterator = _intRepository.GetIterator(); _iterator.HasNext();)
            {
                Console.WriteLine("Object is: " + _iterator.Next());
            }
            Console.ReadLine();
            #endregion
        }
    }
}

//=======================================================================================================

namespace DesignPattern.IteratorPatttern
{
    /// <summary>
    /// 迭代器
    /// </summary>
    public interface Iterator<T>
    {
        bool HasNext();
        T Next();
    }

    /// <summary>
    /// 容器集装箱
    /// </summary>
    public interface IContainer<T>
    {
        Iterator<T> GetIterator();
    }

    /// <summary>
    /// 对象库
    /// </summary>
    public class ObjectRepository<T> : IContainer<T>
    {
        ObjectIterator<T> m_ObjectIterator;

        public ObjectRepository()
        {
            m_ObjectIterator = new ObjectIterator<T>();
        }
        public Iterator<T> GetIterator()
        {
            return m_ObjectIterator;
        }

        public void AddObject(T obj)
        {
            m_ObjectIterator.m_ObjectRepository.Add(obj);
        }

        /// <summary>
        /// 对象迭代器
        /// </summary>
        class ObjectIterator<Tobjcet> : Iterator<Tobjcet>
        {
            public ObjectIterator()
            {
                m_ObjectRepository = new List<Tobjcet>();
            }

            int index;
            public List<Tobjcet> m_ObjectRepository;

            public bool HasNext()
            {
                if (index < m_ObjectRepository.Count)
                {
                    return true;
                }
                return false;
            }

            Tobjcet Iterator<Tobjcet>.Next()
            {
                if (HasNext())
                {
                    return m_ObjectRepository[index++];
                }
                return default;
            }
        }
    }
}

总结:

     个人觉得迭代器模式可以和备忘录模式(Memeton)一起使用,不过一般我们都直接使用for、while或者foreach了,我不知道这个存在的使用地点是什么,可能层次不高还摸不透吧,等之后慢慢的揣摩运用方式和地点吧。 


希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

相关文章:

  • 自考在线做试卷的网站/黑帽seo技巧
  • 中山网站建设怎么样/兰州seo新站优化招商
  • 网站开发用工工程师/买卖网交易平台
  • 阿里巴巴建设网站首页/百度做广告多少钱一天
  • 网站广告素材/合肥网站排名推广
  • qq腾讯官网入口/前端seo主要优化哪些
  • RFID技术应用在服装门店管理
  • select for update是行锁还是表锁,还真得看情况
  • 新领域、新探索、新规划,以色列老牌安全厂商 Check Point 新变化:AI、零日安全
  • Linux面试题
  • vue3 项目篇商场 之 初始化项目
  • STM32模拟SPI总线读写RFID模块RC522
  • 历史最全事件抽取任务分类、经典论文、模型及数据集整理分享
  • 读写锁RWLock简单实现研究
  • 软件测试技术之利用 Jest 为 React 组件编写单元测试
  • JS入门到精通详解(9)
  • 【C语言进阶】自定义类型之结构体
  • mysql新建分区设置阈值(less than)引发的问题