故事
    小美是小雪最好的朋友。有一天, 小美问小雪:“小雪,怎么你的手机短信这么多啊,是不是谈恋爱了?”,小雪笑了一下,说:“还没呢”,小雪停顿了一下,“可是喜欢我的男孩倒是很多,这些男孩都不错,眼都快花了”。小美想了想:“跟我说说这些男孩子,我帮你选一个最优秀的”。

果然,小美开始给小雪策划了一个钻石王老五大调查(遍历):
    1) 年龄小于30大于35者出局;
    2) 身高低于180cm者出局;
    3) 无房者出局;
    4) 无车者出局;
    5) 年薪低于100万者出局。

迭代器模式(ITerator)的解决方案
       迭代器模式的意图:通过顺序遍历或逆序遍历等方式访问集合对象(List)中的各元素子对象(object)。一般来说,一个集合对象拥有两个职责:一是存储一组元素子对象;二是遍历集合中的各元素子对象。从依赖性来讲,前者是集合对象的根本属性;后者是可分离的变化点。

子对象接口如下:

namespace XiaoXue
{
    public interface IBoy
    {
        string Name{get;}
        int GetAge();
        int GetHeight();
        bool HasHouse();
        bool HasCar();
        bool HasMillion();
    }
}

子对象具体类如下:

namespace XiaoXue
{
    public class BoyA : IBoy
    {
        private string _Name="张三";
        public string Name
        {
            get{ return _Name;}
        }
        public int GetAge()
        {
            return 25;
        }
        public int GetHeight()
        {
            return 187;
        }
        public bool HasHouse()
        {
            return true;
        }
        public bool HasCar()
        {
            return false;
        }
        public bool HasMillion()
        {
            return false;
        }
    }
   public class BoyB : IBoy
    {
        private string _Name="李四";
        public string Name
        {
            get{ return _Name;}
        }
        public int GetAge()
        {
            return 32;
        }
        public int GetHeight()
        {
            return 170;
        }
        public bool HasHouse()
        {
            return true;
        }
        public bool HasCar()
        {
            return true;
        }
        public bool HasMillion()
        {
            return true;
        }
    }
}

迭代器接口如下:

namespace XiaoXue
{
       public interface IListIterator
       {
           void First();
           void Last();
           bool MovePrevous();
           bool MoveNext();
           object Current{get;}
       }
}

迭代器如下:

namespace XiaoXue
{
       public class BoyList:IListIterator
       {
           private List<IBoy> boys = null;//子对象列表
           private int index=-1;
           public BoyList()
           {
               boys = new List<IBoy>();
           }
           //添加子对象
           public void AddBoy(IBoy boy)
           {
               boys.Add(boy);
           }
           public void RemoveBoy(IBoy boy)
           {
               boys.Remove(boy);
               index--;
           }
           public void First()
           {
               index=0;
           }
           public void Last()
           {
               index=boys.Count;
           }
           public bool MovePrevious()
           {
               index--;
               return index>-1;
           }
           public bool MoveNext()
           {
               index++;
               return index<boys.Count;
           }
           public object Current
           {
               get {return this.boys[index];}
           }
    }
}

调用代码如下:

IListIterator iterator=new BoyList();
iterator.AddBoy(new BoyA());
iterator.AddBoy(new BoyB());
while (iterator.MoveNext())
{
       IBoy boy=(IBoy)iterator.Current
       if (boy.GetAge()<30 || boy.GetAge()>35)
       {
           iterator.RemoveBoy(boy);
       }
       else if (boy.GetHeight()<180)
       {
           iterator.RemoveBoy(boy);
       }
       else if (!boy.HasHouse())
       {
           iterator.RemoveBoy(boy);
       }
       else if (!boy.HasCar())
       {
           iterator.RemoveBoy(boy);
       }
       else if (!boy.HasMillion())
       {
           iterator.RemoveBoy(boy);
       }
       else
       {
              Console.WriteLine(boy.Name);
       }
}

哈哈, 好象没有一个符合条件的,俗话说:“什么样的马配什么样的鞍”。这样的王老五只有到月球上去找吧!

转载于:https://www.cnblogs.com/ruochen/archive/2007/12/20/1006772.html

设计模式系列漫谈之五 - 迭代器模式相关推荐

  1. php 规格,PHP 设计模式系列之 specification规格模式_PHP

    Plus.php left = $left; $this->right = $right; } /** * 返回两种规格的逻辑与评估 * * @param Item $item * * @ret ...

  2. 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...

    转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...

  3. 设计模式漫谈之迭代器模式

    谈恋爱是两个人的事,结婚是两个家庭的事.最近事也挺多的.我也挺烦的,有时候,我也为自己的将来担忧,我自认为自己的技术过硬,但是千里马只有遇到伯乐才能发挥作用. 技术上让我高兴的事是,有个技术问题终于突 ...

  4. 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别

    状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...

  5. 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现

    解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...

  6. JavaScript设计模式系列四之外观模式(附案例源码)

    文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什么还 ...

  7. 《Head first设计模式》学习笔记 – 迭代器模式

    迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...

  8. C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】

    一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...

  9. 大战设计模式【12】—— 迭代器模式

    迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 提供一种方法顺序访问一个聚合 ...

最新文章

  1. SDOI2014 LIS
  2. See system logs and 'systemctl status xxx.service' for details.错误的解决方法
  3. jmetter持续时间_Jmeter常用线程组设置及场景运行时间计算
  4. 2021年5月信息系统项目管理师案例分析真题+视频讲解(3)
  5. 服务器操作系统百度文库,Linux操作系统配置服务器的方法及实现_百度文库(6页)-原创力文档...
  6. mysql符合安可要求吗,安可是什么意思?演唱太过精彩,粉丝要求返场(再唱一个)...
  7. biodist r语言_R语言 Biostrings包 pairwiseAlignment()函数中文帮助文档(中英文对照)
  8. mysql 聚集函数 count 使用详解(转载)
  9. 可重入性和线程安全性
  10. 浅谈LockSupport工具类
  11. win10无线投屏_win10怎么进行无线投屏 —卡菜克特别情报
  12. 中国计算机报-用友华表成功秘密
  13. 强主动性的人,如何做事一杠子到底?
  14. L2-039 清点代码库 - java
  15. 我把csdn版权标志隐藏了.
  16. hexo搭建博客的几种方式(入门级)
  17. pc网站和手机端h5网站开发接入微信支付
  18. Linux安装expect
  19. 【DIY文章列表标签】dt_gry_list
  20. 进程间的几种通信方式的比较和线程间的几种通信方式

热门文章

  1. mysql工作中遇到的问题_MySQL工作中遇到的问题记录
  2. php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
  3. 基于javaweb(springboot+mybatis)网上酒类商城项目设计和实现以及文档报告
  4. 用python绘制心形_python小趣味_520绘制一个心形.
  5. 生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?
  6. 主流的计算机电源,主流电源评测
  7. html中链接不自动变色,HTML 点击 标签 链接 点击之后变色-转发【已解决】
  8. c语言平面向量加法考点,平面向量的加减法怎么死活都不会?有没有什么口诀?例如:向量AB+BC=?向量OA-OB=?向量AB-CB=?有没有什么口诀!...
  9. 零基础爬虫requests初阶教程,手把手教你爬数据
  10. java设计模式 外观,精掌握Java设计模式之外观模式(10)