生活在城市,平時少不了去餐館吃飯。或是加班下班之後,難免吃上宵夜之後,才回家。
在餐館或是大排檔坐下,老闆一般都會在第一時間,給你上茶水以及菜單(在此博文中,這是重點)。我們接過菜單之後,都會把菜單周遊一遍,不放過任一美味與自己喜歡吃的佳肴。
周遊一遍,此就是一種開發的設計模式,叫疊代器設計模式。
疊代器模式,它提供一種方法順序通路一個聚合對象中各個元素,而又不暴露該對象的内部表示。
我們接過菜單,使用兩眼從頭至尾或是從後往前看。菜單聚集結構提供了第一項,下一項,是否結束,目前是哪一項了,是不是自己需要點的菜式。是以我們提供一個疊代的抽象類:
Iterator
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for Iterator
/// </summary>
namespace Insus.NET
{
public abstract class Iterator
{
public abstract object FirstItem();
public abstract object NextItem();
public abstract object CurrentItem();
public abstract bool isDone();
}
}
還要提供一個聚集的抽象類:
Aggregate
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for Aggregate
/// </summary>
namespace Insus.NET
{
public abstract class Aggregate
{
public abstract Iterator CreateIterator();
}
}
具體的疊代類:
ConcreteIterator
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for ConcreteIterator
/// </summary>
namespace Insus.NET
{
public class ConcreteIterator : Iterator
{
//宣告一個具體聚集,菜單
private ConcreteAggregate _Aggregate;
private int currentItem = 0;
// 構造函數,傳入真正的聚集對象傳入。
public ConcreteIterator(ConcreteAggregate aggregate)
{
this._Aggregate = aggregate;
}
//擷取第一個菜單項目名稱
public override object FirstItem()
{
return _Aggregate[0];
}
//下一個菜單項目名稱
public override object NextItem()
{
object obj = null;
currentItem ++;
if (currentItem < _Aggregate.Count)
obj = _Aggregate[currentItem];
return obj;
}
//浏覽至目前的菜單項目名稱
public override object CurrentItem()
{
return _Aggregate[currentItem];
}
//是否浏覽至菜單結尾。如果是,傳回bool真(true)值。
public override bool isDone()
{
return currentItem >= _Aggregate.Count ? true : false;
}
}
}
具體的聚集類,如菜單:
ConcreteAggregate
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// Summary description for ConcreteAggregate
/// </summary>
namespace Insus.NET
{
public class ConcreteAggregate : Aggregate
{
List<object> items = new List<object>();
public override Iterator CreateIterator()
{
return new ConcreteIterator(this);
}
public int Count
{
get
{
return items.Count;
}
}
//宣告一個索引器
public object this[int index]
{
get
{
return items[index];
}
set
{
items.Insert(index, value);
}
}
}
}
站點運作看看:
IteratorDemo.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;
public partial class IteratorDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ConcreteAggregate ca = new ConcreteAggregate();
ca[0] = "砂鍋粥";
ca[1] = "炸子雞";
ca[2] = "海棠冬菇";
ca[3] = "佛手排骨";
ca[4] = "廣州文昌雞";
ca[5] = "潮式腸粉";
ca[6] = "蚝皇鳳爪";
Iterator i = new ConcreteIterator(ca);
object item = i.FirstItem();
while (!i.isDone())
{
HttpContext.Current.Response.Write(i.CurrentItem());
i.NextItem();
}
}
}
疊代設計模式源代碼(.net 4.0):
http://download.cnblogs.com/insus/CSharpNET/Insus_Iterator.rar