zoukankan      html  css  js  c++  java
  • 看菜谱点餐,迭代设计模式(Iterator)

    生活在城市,平时少不了去餐馆吃饭。或是加班下班之后,难免吃上宵夜之后,才回家。

    在餐馆或是大排档坐下,老板一般都会在第一时间,给你上茶水以及菜谱(在此博文中,这是重点)。我们接过菜谱之后,都会把菜谱遍历一遍,不放过任一美味与自己喜欢吃的佳肴。

    遍历一遍,此就是一种开发的设计模式,叫迭代器设计模式。

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

    我们接过菜谱,使用两眼从头至尾或是从后往前看。菜谱聚集结构提供了第一项,下一项,是否结束,当前是哪一项了,是不是自己需要点的菜式。因此我们提供一个迭代的抽象类: 

    Iterator
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for Iterator
    /// </summary>
    namespace Insus.NET
    {
        public abstract class Iterator
        {
            public abstract object FirstItem();
            public abstract object NextItem();
            public abstract object CurrentItem();
            public abstract bool isDone();
        }
    }


    还要提供一个聚集的抽象类:

    Aggregate
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for Aggregate
    /// </summary>
    namespace Insus.NET
    {
        public abstract class Aggregate
        {
            public abstract Iterator CreateIterator();
        }
    }


    具体的迭代类:

    ConcreteIterator
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for ConcreteIterator
    /// </summary>
    namespace Insus.NET
    {
        public class ConcreteIterator : Iterator 
        {
            
            //宣告一个具体聚集,菜谱
            private ConcreteAggregate _Aggregate;
    
            private int currentItem = 0;
            
    
            // 构造函数,传入真正的聚集对象传入。
            public ConcreteIterator(ConcreteAggregate aggregate)
            {
                this._Aggregate = aggregate;
            }
    
            //获取第一个菜谱项目名称
            public override object FirstItem()
            {
                return _Aggregate[0];
            }
    
            //下一个菜谱项目名称
            public override object NextItem()
            {
                object obj = null;
                currentItem ++;
                if (currentItem < _Aggregate.Count)
                    obj = _Aggregate[currentItem];
    
                return obj;
            }
    
    
            //浏览至当前的菜谱项目名称
            public override object CurrentItem()
            {
                return _Aggregate[currentItem];
            }
    
            //是否浏览至菜谱结尾。如果是,返回bool真(true)值。
            public override bool isDone()
            {
                return currentItem >= _Aggregate.Count ? true : false;
            }
        }
    }


    具体的聚集类,如菜谱:

    ConcreteAggregate
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    /// Summary description for ConcreteAggregate
    /// </summary>
    namespace Insus.NET
    {
        public class ConcreteAggregate : Aggregate
        {
            List<object> items = new List<object>();
    
            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);
                }
            }
        }
    }

    站点运行看看:

    IteratorDemo.aspx.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Insus.NET;
    
    public partial class IteratorDemo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ConcreteAggregate ca = new ConcreteAggregate();
            ca[0] = "砂锅粥";
            ca[1] = "炸子鸡";
            ca[2] = "海棠冬菇";
            ca[3] = "佛手排骨";
            ca[4] = "广州文昌鸡";
            ca[5] = "潮式肠粉";
            ca[6] = "蚝皇凤爪";
    
            Iterator i = new ConcreteIterator(ca);
    
            object item = i.FirstItem();
    
            while (!i.isDone())
            {
                HttpContext.Current.Response.Write(i.CurrentItem());
                i.NextItem();
            }
        }
    }

     迭代设计模式源代码(.net 4.0):

     http://download.cnblogs.com/insus/CSharpNET/Insus_Iterator.rar

  • 相关阅读:
    Linux下干净卸载mysql详解
    服务器重启后 django无法连接mysql数据库的解决方法
    团队排表系统V3.0最佳实践及使用说明
    nginx配置部署多个单页应用 踩坑
    前端项目首屏加速 gzip打包 路由懒加载 cdn资源优化
    JS实现手动将String转换为utf8格式的arraybuffer
    微信小程序Component组件调用回调函数this指向不是本页面
    linux系统后台运行python, 关闭shell后不会中断
    pycharm连接数据库失败
    react添加onScroll事件踩坑
  • 原文地址:https://www.cnblogs.com/insus/p/2941104.html
Copyright © 2011-2022 走看看