设计模式系列漫谈之五 - 迭代器模式
故事
小美是小雪最好的朋友。有一天, 小美问小雪:“小雪,怎么你的手机短信这么多啊,是不是谈恋爱了?”,小雪笑了一下,说:“还没呢”,小雪停顿了一下,“可是喜欢我的男孩倒是很多,这些男孩都不错,眼都快花了”。小美想了想:“跟我说说这些男孩子,我帮你选一个最优秀的”。
果然,小美开始给小雪策划了一个钻石王老五大调查(遍历):
1) 年龄小于30大于35者出局;
2) 身高低于180cm者出局;
3) 无房者出局;
4) 无车者出局;
5) 年薪低于100万者出局。
迭代器模式(ITerator)的解决方案
迭代器模式的意图:通过顺序遍历或逆序遍历等方式访问集合对象(List)中的各元素子对象(object)。一般来说,一个集合对象拥有两个职责:一是存储一组元素子对象;二是遍历集合中的各元素子对象。从依赖性来讲,前者是集合对象的根本属性;后者是可分离的变化点。
子对象接口如下:
{
public interface IBoy
{
string Name{get;}
int GetAge();
int GetHeight();
bool HasHouse();
bool HasCar();
bool HasMillion();
}
}
子对象具体类如下:
{
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;
}
}
}
迭代器接口如下:
{
public interface IListIterator
{
void First();
void Last();
bool MovePrevous();
bool MoveNext();
object Current{get;}
}
}
迭代器如下:
{
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];}
}
}
}
调用代码如下:
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
设计模式系列漫谈之五 - 迭代器模式相关推荐
- php 规格,PHP 设计模式系列之 specification规格模式_PHP
Plus.php left = $left; $this->right = $right; } /** * 返回两种规格的逻辑与评估 * * @param Item $item * * @ret ...
- 设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)...
转自:http://www.cnblogs.com/stonehat/archive/2012/04/16/2451891.html 设计模式系列--三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂 ...
- 设计模式漫谈之迭代器模式
谈恋爱是两个人的事,结婚是两个家庭的事.最近事也挺多的.我也挺烦的,有时候,我也为自己的将来担忧,我自认为自己的技术过硬,但是千里马只有遇到伯乐才能发挥作用. 技术上让我高兴的事是,有个技术问题终于突 ...
- 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别
状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...
- 【设计模式系列20】解释器模式原理及其在JDK和Spring源码中的体现
解释器模式原理及其在JDK源码中的体现 设计模式系列总览 前言 什么是解释器模式 终结符表达式和非终结符表达式 解释器模式示例 解释器模式角色 解释器模式在JDK和Spring源码中应用 解释器模式应 ...
- JavaScript设计模式系列四之外观模式(附案例源码)
文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什么还 ...
- 《Head first设计模式》学习笔记 – 迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 爆炸性新闻:对象村餐厅和对象村煎饼屋合并了! 真是个好消息!现在我们可以在同一个地方,享用煎饼屋美味的煎饼早餐,和好吃 ...
- C#设计模式之十五迭代器模式(Iterator Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第三个模式,该模式是[迭代器模式],英文名称是:Iterator Pattern.还是老套路,先从名字上来看看."迭代器模式& ...
- 大战设计模式【12】—— 迭代器模式
迭代器模式(Iterator) 设计模式使用的例子https://github.com/LinkinStars/DesignPatternsAllExample 一.定义 提供一种方法顺序访问一个聚合 ...
最新文章
- SDOI2014 LIS
- See system logs and 'systemctl status xxx.service' for details.错误的解决方法
- jmetter持续时间_Jmeter常用线程组设置及场景运行时间计算
- 2021年5月信息系统项目管理师案例分析真题+视频讲解(3)
- 服务器操作系统百度文库,Linux操作系统配置服务器的方法及实现_百度文库(6页)-原创力文档...
- mysql符合安可要求吗,安可是什么意思?演唱太过精彩,粉丝要求返场(再唱一个)...
- biodist r语言_R语言 Biostrings包 pairwiseAlignment()函数中文帮助文档(中英文对照)
- mysql 聚集函数 count 使用详解(转载)
- 可重入性和线程安全性
- 浅谈LockSupport工具类
- win10无线投屏_win10怎么进行无线投屏 —卡菜克特别情报
- 中国计算机报-用友华表成功秘密
- 强主动性的人,如何做事一杠子到底?
- L2-039 清点代码库 - java
- 我把csdn版权标志隐藏了.
- hexo搭建博客的几种方式(入门级)
- pc网站和手机端h5网站开发接入微信支付
- Linux安装expect
- 【DIY文章列表标签】dt_gry_list
- 进程间的几种通信方式的比较和线程间的几种通信方式
热门文章
- mysql工作中遇到的问题_MySQL工作中遇到的问题记录
- php+控制器+数据库,Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法_PHP...
- 基于javaweb(springboot+mybatis)网上酒类商城项目设计和实现以及文档报告
- 用python绘制心形_python小趣味_520绘制一个心形.
- 生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?
- 主流的计算机电源,主流电源评测
- html中链接不自动变色,HTML 点击 标签 链接 点击之后变色-转发【已解决】
- c语言平面向量加法考点,平面向量的加减法怎么死活都不会?有没有什么口诀?例如:向量AB+BC=?向量OA-OB=?向量AB-CB=?有没有什么口诀!...
- 零基础爬虫requests初阶教程,手把手教你爬数据
- java设计模式 外观,精掌握Java设计模式之外观模式(10)