迭代器模式(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. [LeetCode141]Linked List Cycle

    题目:Given a linked list, determine if it has a cycle in it. 判断一个链表是否有环 代码: /** * Definition for singl ...

  2. Android - 支持不同的设备

    世界上有各种不一样形状和大小的Android设备.由于有各种不同类型的设备,你的app可能在各种设备上运行.为了在Android上尽可能的成功,你的app需要使配各种不同的设备.最重要的几点需要考虑的 ...

  3. 安装framework 3.5出现0x800F0922的解决方法

    关闭Windows 防火墙,启动Windows model install服务 重启! 再安装 就ok了

  4. POST和Get辨析

    在Form里面,能够使用post也能够使用get.它们都是method的合法取值,可是两者也有不同,主要差别在于传递和获取參数的方式不同 一.Get方法: 1.參数的传递方式: 通过URL请求来传递用 ...

  5. web压力测试-pylot

    我已经写在使用前Web Bench做压力測试.http://blog.csdn.net/jacson_bai/article/details/41143713 但这个測试,測试结果非常好.缺点就是,无 ...

  6. UVA11396-Claw Decomposition(二分图判定)

    题目链接 题意:能否将一张无向连通图分解成多个爪型.每一条边仅仅能属于一个爪型,每一个点的度数为3. 思路:当图分解成类干个爪型时,每条边仅仅属于一个爪子,所以每条边的两个点一定要处于2个不同的鸡爪中 ...

  7. Java 启动线程的方式

    面试题:JAVA启动线程的方式有哪些? 1.继承Thread [java] view plaincopy public class java_thread extends Thread{ public ...

  8. swift类名称显示变量

    <span style="background-color: rgb(255, 255, 255); color: rgb(51, 51, 51); font-family: Aria ...

  9. zoj-3795-Grouping-tarjan确定最长的公路收缩

    使用tarjan缩合点. 然后,dfs寻找最长的公路. 水体. . . #include<stdio.h> #include<string.h> #include<alg ...

  10. WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)

    WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作) 好吧,还是那个社区APP,非管理系统,用户行为日志感觉不是很必要的,但是,错误日 ...