迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。

模式角色与结构:

实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CSharp.DesignPattern.IteratorPattern
{
class Program
{
static void Main(string[] args)
{
List<Object> objects = new List<Object>();
objects.Add("倚天剑");
objects.Add("屠龙刀");
objects.Add("断肠草");
objects.Add("葵花宝典");
objects.Add("四十二章经"); Aggregate list;
Iterator iterator; list = new ConcreteAggregate(objects); // 创建聚合对象
iterator = list.CreateIterator(); // 创建迭代器对象 Console.WriteLine("正向遍历:");
while(!iterator.IsLast()) {
Console.WriteLine(iterator.GetNextItem() + ",");
iterator.Next();
}
Console.WriteLine();
Console.WriteLine("-----------------------------");
Console.WriteLine("逆向遍历:");
while(!iterator.IsFirst()) {
Console.WriteLine(iterator.GetPreviousItem() + ",");
iterator.Previous();
} Console.ReadLine();
}
} // 抽象迭代器
interface Iterator
{
void Next(); // 指向下一个元素
void Previous(); // 移至上一个元素
Boolean IsLast(); // 判断是否为最后一个元素
Boolean IsFirst(); // 判断是否为第一个元素
Object GetNextItem(); // 获取下一个元素
Object GetPreviousItem(); // 获取上一个元素
} // 具体迭代器
class ConcreteIterator : Iterator
{
private ConcreteAggregate aggregate; // 维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据
private List<Object> objects; private int cursor1; // 定义一个游标,用于记录当前访问位置
private int cursor2; public ConcreteIterator(ConcreteAggregate aggregate)
{
this.aggregate = aggregate;
this.objects = aggregate.GetObjects(); // 获得集合对象 cursor1 = ; // 设置正向遍历游标的初始值
cursor2 = objects.Count - ; // 设置逆向遍历游标的初始值
} public void Next()
{
if (cursor1 < objects.Count)
{
cursor1++;
}
} public void Previous()
{
if (cursor2 > -)
{
cursor2--;
}
} public Boolean IsLast()
{
return (cursor1 == objects.Count);
} public Boolean IsFirst()
{
return (cursor2 == -);
} public Object GetNextItem()
{
return objects[cursor1];
} public Object GetPreviousItem()
{
return objects[cursor2];
}
} // 抽象聚合类
abstract class Aggregate
{
protected List<Object> objects = new List<Object>(); public Aggregate(List<Object> objects)
{
this.objects = objects;
} public void AddObject(Object obj) {
this.objects.Add(obj);
} public void RemoveObject(Object obj) {
this.objects.Remove(obj);
} public List<Object> GetObjects() {
return this.objects;
} // 声明创建迭代器对象的抽象工厂方法
public abstract Iterator CreateIterator();
} // 具体聚合类
class ConcreteAggregate : Aggregate
{
public ConcreteAggregate(List<Object> objects)
: base(objects)
{ } public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
}
}

CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)的更多相关文章

  1. Head First 设计模式读书笔记(1)-策略模式

    一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...

  2. CSharp设计模式读书笔记(24):访问者模式(学习难度:★★★★☆,使用频率:★☆☆☆☆)

    模式角色与结构: 示例代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)

    模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...

  4. CSharp设计模式读书笔记(22):策略模式(学习难度:★☆☆☆☆,使用频率:★★★★☆)

    策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy). 模式角色与结构: ...

  5. CSharp设计模式读书笔记(21):状态模式(学习难度:★★★☆☆,使用频率:★★★☆☆)

    模式角色与结构: 示例代码:(本示例在具体状态类中实现状态切换,也可以在环境类中实现状态切换.状态模式一定程度上违背开闭原则) using System; using System.Collectio ...

  6. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...

  7. CSharp设计模式读书笔记(15):命令模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式,其别名为 ...

  8. CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    职责链模式(Chain of Responsibility  Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...

  9. CSharp设计模式读书笔记(13):代理模式(学习难度:★★★☆☆,使用频率:★★★★☆)

    代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问. 模式角色与结构: 示例代码: using System; using System.Collections.Generi ...

随机推荐

  1. HDU 1228 A + B 浙江大学研究生冠军

    Problem Description 读入两个小于100的正整数A和B,计算A+B. 须要注意的是:A和B的每一位数字由相应的英文单词给出.   Input 測试输入包括若干測试用例,每一个測试用例 ...

  2. unity3d中让物体显示和隐藏

    unity3d中让物体显示和隐藏的方法 gameObject.renderer.enabled //是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 仅仅是想当于隐身 而物体本身的碰撞体还 ...

  3. cocos2d-x box2d Demo注解

    勤奋努力,持之以恒. 核心概念 Box2D 中有一些主要的对象,这里我们先做一个简要的定义,在随后的文档里会有更具体的描写叙述. 刚体(rigid body) 一块十分坚硬的物质,它上面的不论什么两点 ...

  4. nginx 日志和监控

    原文地址:http://nginx.com/resources/admin-guide/logging-and-monitoring/ Logging and Monitoring 日志和监控 Thi ...

  5. 【iOS】Web Color 的 Swift 实现

    用Swift语言重写Web Color这个类. 这次是用函数实现的,感觉也非常简洁.眼下(2014.6.28) Xcode 6的方法提示还不健全,就仅仅实现了用颜色名字创建颜色的功能. 最新代码&am ...

  6. [Unity3d]定义自己的鼠标

    [Unity3d]自己定义鼠标 我们在用unity3d开发自己的游戏的时候.自己定义游戏中的鼠标也是常常要用到的.那我就得学学.事实上原理非常easy,先将鼠标给隐藏,然后在鼠标的位置上画出一个自己定 ...

  7. 思维导图(自己整理,希望对大家有用):JavaScript函数+canvas绘图+Array数组

    1.javascript函数: 2.Array数组: 3.canvas绘图:

  8. android键盘锁定问题

    android经常使用KeyguardLock解锁.但需要使用后打电话reenableKeyguard()锁定被解除.否则,会导致其他进程无法锁定屏幕,使用相同的WakeLock唤醒屏幕后还需要使用r ...

  9. Windows Phone 选择器

    using Microsoft.Phone.Controls; using Microsoft.Phone.Tasks; using System; using System.Windows; nam ...

  10. .NET单元测试艺术(3) - 使用桩对象接触依赖

    List 3.1 抽取一个设计文件系统的类,并调用它 [Test] public bool IsValidLogFileName(string fileName) { FileExtensionMan ...