zoukankan      html  css  js  c++  java
  • C#设计模式:迭代器模式(Iterator Pattern)

    一,什么是迭代器模式(Iterator Pattern)

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

    二,看下面例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace _15.迭代器模式
    { //提供一种方法顺序访问一个容器对象中的各个元素,而又不需要暴露该对象的内部表示
        class Program
        {
            static void Main(string[] args)
            {
                Aggregate<object> a = new ConcreteAggregate<object>();
                a.add("中国人");
                a.add("美国人");
                a.add("日本人");
                Iterator<object> i = a.iterator();
                while (i.hasNext())
                {
                    Console.WriteLine("获取当前:" + i.GetObj());
                    Console.WriteLine("获取下一个:" + i.next());
                    Console.WriteLine("是否是第一个:" + i.IsFirst());
                    Console.WriteLine("是否是最后一个:" + i.IsLast());
                }
            }
        }
        /// <summary>
        /// 迭代器接口,迭代器接口负责定义,访问和遍历元素的接口
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public interface Iterator<T> where T : new()
        {
            /// <summary>
            ///是否还有下一个元素 true 表示有,false 表示没有 
            /// </summary>
            /// <returns></returns>
            bool hasNext();
            /// <summary>
            /// 返回当前位置的元素并将位置移至下一位 
            /// </summary>
            /// <returns></returns>
            T next();
            /// <summary>
            /// 判断是否是第一个
            /// </summary>
            /// <returns></returns>
            bool IsFirst();
            /// <summary>
            ///   判断游标是否是容器的最后一个
            /// </summary>
            /// <returns></returns>
            bool IsLast();
            /// <summary>
            /// 获取当前游标指向的元素
            /// </summary>
            /// <returns></returns>
            T GetObj();
        }
        /// <summary>
        /// 具体迭代器类,具体迭代器类的目的主要是实现迭代器接口,并记录遍历的当前位置。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ConcreteIterator<T> : Iterator<T> where T : new()
        {
            private List<T> list = new List<T>();
            private int cursor = 0;
    
            public ConcreteIterator(List<T> list)
            {
                this.list = list;
            }
            /// <summary>
            ///是否还有下一个元素 true 表示有,false 表示没有 
            /// </summary>
            /// <returns></returns>
            public bool hasNext()
            {
                return cursor != list.Count();
            }
            /// <summary>
            /// 获取下一个
            /// </summary>
            /// <returns></returns>
            public T next()
            {
                T obj = new T();
                if (this.hasNext())
                {
                    obj = this.list[cursor++];
                }
                return obj;
            }
            /// <summary>
            /// 判断是否是第一个
            /// </summary>
            /// <returns></returns>
            public bool IsFirst()
            {
                return cursor - 1 == 0 ? true : false;
            }
            /// <summary>
            ///   判断游标是否是容器的最后一个
            /// </summary>
            /// <returns></returns>
            public bool IsLast()
            {
    
                return cursor == (list.Count()) ? true : false;
            }
            /// <summary>
            /// 获取当前游标指向的元素
            /// </summary>
            /// <returns></returns>
            public T GetObj()
            {
                return list[cursor];
            }
        }
        /// <summary>
        /// 容器接口,容器接口负责提供创建具体迭代器角色的接口
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public interface Aggregate<T> where T : new()
        {
            /// <summary>
            ///  添加一个元素
            /// </summary>
            /// <param name="obj"></param>
            void add(T obj);
            /// <summary>
            /// 移除一个元素 
            /// </summary>
            /// <param name="obj"></param>
            void remove(T obj);
            /// <summary>
            /// 获取容器的迭代器 
            /// </summary>
            /// <returns></returns>
            Iterator<T> iterator();
    
        }
        /// <summary>
        /// 具体容器类。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public class ConcreteAggregate<T> : Aggregate<T> where T : new()
        {
            private List<T> list = new List<T>();
    
            public void add(T obj)
            {
                list.Add(obj);
            }
    
            public void remove(T obj)
            {
                list.Remove(obj);
            }
            public Iterator<T> iterator()
            {
                return new ConcreteIterator<T>(list);
            }
        }
    }
  • 相关阅读:
    zbb20170802 Windows平台使用Gitblit搭建Git服务器图文教程
    zbb20170728 oracle 查看被锁对象
    zbb20170726 Spring Controller 获取请求参数的几种方法
    zbb20170726 spring访问静态文件访问
    zbb20170720 extjs 类似桌面的页面布局
    zbb20170718 Eclipse 导入外部项目无法识别为web项目并且无法在部署到tomcat下
    zbb20170717Spring4 MVC Hibernate4集成 Annotation maven 各种版本
    zbb20170630 web项目发布至tomcat的ROOT下方法(开发环境和部署环境)
    3.语句的增删改查
    1、java面试
  • 原文地址:https://www.cnblogs.com/May-day/p/8963150.html
Copyright © 2011-2022 走看看