zoukankan      html  css  js  c++  java
  • 迭代器模式 -- 大话设计模式

    在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

    迭代器模式:分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴漏集合的内部结构,又可让外部代码透明地访问集合内部的数据

    1.售票员售票

      公交车进站,乘客上车,售票员登场,遍历乘客,购买车票

      首先定义迭代器抽象类和聚集抽象类

        /// <summary>
        /// 迭代器抽象类
        /// </summary>
        public abstract class IAmyEnumerator
        {
            /// <summary>
            /// 得到开始对象
            /// </summary>
            public abstract object First();
    
            /// <summary>
            /// 得到下一个对象
            /// </summary>
            public abstract object Next();
    
            /// <summary>
            /// 是否到结尾
            /// </summary>
            public abstract bool IsDone();
    
            /// <summary>
            /// 当前对象
            /// </summary>
            public abstract object CurrentItem();
        }
    
        /// <summary>
        /// 聚集抽象类
        /// </summary>
        public abstract class IAmyEnumerable
        {
            /// <summary>
            /// 创建迭代器
            /// </summary>
            public abstract IAmyEnumerator GetAmyEnumerator();
        }
    

       定义售票员(具体迭代器类)和公交车类(具体聚集类)

        /// <summary>
        /// 售票员类(具体迭代器类)
        /// </summary>
        public class TicketSeller : IAmyEnumerator
        {
            private Bus aggregate;
            private int current = 0;
    
            public TicketSeller(Bus aggregate)
            {
                this.aggregate = aggregate;
            }
    
            public override object First()
            {
                return aggregate[0];
            }
    
            public override object Next()
            {
                object ret = null;
    
                current++;
    
                if (current < aggregate.Count)
                {
                    ret = aggregate[current];
                }
    
                return ret;
            }
    
            public override bool IsDone()
            {
                return current >= aggregate.Count;
            }
    
            public override object CurrentItem()
            {
                return aggregate[current];
            }
        }
    
        /// <summary>
        /// 公交车类(具体聚集类)
        /// </summary>
        public class Bus : IAmyEnumerable
        {
            //存放集合对象
            private IList<object> items = new List<object>();
    
            public override IAmyEnumerator GetAmyEnumerator()
            {
                return new TicketSeller(this);
            }
    
            /// <summary>
            /// 返回集合对象总数
            /// </summary>
            public int Count
            {
                get { return items.Count; }
            }
    
            /// <summary>
            /// 声明一个索引器
            /// </summary>
            public object this[int index]
            {
                get { return items[index]; }
                set { items.Insert(index, value); }
            }
        }
    

       开始场景模拟

            static void Main(string[] args)
            {
                //公交车进站
                Bus bus = new Bus();
    
                //乘客上车
                bus[0] = "大鸟";
                bus[1] = "小菜";
                bus[2] = "乘客A";
    
                //售票员登场
                TicketSeller seller = new TicketSeller(bus);
    
                //遍历乘客,购买车票
                object item = seller.First();
                while (!seller.IsDone())
                {
                    Console.WriteLine("{0}请买车票!", seller.CurrentItem());
                    seller.Next();
                }
            }
    
  • 相关阅读:
    sqlserver之高灵活的业务单据流水号生成
    Putty的ppk格式密钥在linux与mac上无法支持
    矩形圆角调整
    新的旅途
    AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)
    轻量级的惰性控件——ViewStub
    Android的WebView通过JS调用java代码
    对TextVIew中特定字符串设定onTouchEvent方法
    同步任务 AsyncTask 介绍
    自定义可点击的ImageSpan并在TextView中内置“View“
  • 原文地址:https://www.cnblogs.com/amywechat/p/4929257.html
Copyright © 2011-2022 走看看