您的位置:首页 > 编程语言 > C#

CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)

2014-09-25 21:38 309 查看
迭代器模式(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 = 0; // 设置正向遍历游标的初始值
cursor2 = objects.Count - 1; // 设置逆向遍历游标的初始值
}

public void Next()
{
if (cursor1 < objects.Count)
{
cursor1++;
}
}

public void Previous()
{
if (cursor2 > -1)
{
cursor2--;
}
}

public Boolean IsLast()
{
return (cursor1 == objects.Count);
}

public Boolean IsFirst()
{
return (cursor2 == -1);
}

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐