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

  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/insus/p/2941104.html
Copyright © 2011-2022 走看看