Iterator Pattern 為反覆器讓我們能夠取得collection內的元素(string)而不需要取得collection (List<string>,string[]) 這樣的好處讓我們可以將這些元素 一視同仁(printDevice)
讓我們方便處理
下面的sample 我們希用使用printDevice 去印出Ted 和 Paul身上的配件
讓我們方便處理
下面的sample 我們希用使用printDevice 去印出Ted 和 Paul身上的配件
但是他們兩個是使用不同的collection Ted是使用List<string> 而 Paul是使用string[]
通常都會使用以下的寫法
class Ted_Devices
{
private List<string> items = new List<string>();
public Ted_Devices()
{
items.Add("Phone");
items.Add("Bag");
items.Add("Pad");
}
public List<string> GetItems()
{
return items;
}
}
class Paul_Devices
{
private string[] items = new string[3];
public Paul_Devices()
{
items[0]="Pencil";
items[1]="Watch";
items[2]="book";
}
public string[] GetItems()
{
return items;
}
}
static void Main(string[] args)
{
Ted_Devices TD = new Ted_Devices();
List<string> TD_list = TD.GetItems();
Paul_Devices PD = new Paul_Devices();
string[] PD_list = PD.GetItems();
Console.WriteLine("===Ted list====");
printDevice(TD_list);
Console.WriteLine("====Paul list====");
printDevice(PD_list);
Console.ReadLine();
}
private static void printDevice(object obj)
{
if (obj is List<string>)
{
foreach (string item in obj as List<string>)
{
Console.WriteLine(item);
}
}
else
{
foreach (string item in obj as string[])
{
Console.WriteLine(item);
}
}
}
Result:===Ted list====
Phone
Bag
Pad
====Paul list====
Pencil
Watch
book
這樣的缺點是
當需要印更多人的裝置而每個人使用的collection的格式都不同時
例如出現了 int[] , List<CustomData>, ....等等的資料時
printDevice 就會長的越來越可怕 判斷式越來越多
如果這時出現新的需求不是只需要印device
還需要針對每個人身上的配件去做其他項目的處理時....
這樣的code就會變的非常難以maintain以及新增功能
下面的寫法是使用Iterator的方式
public interface Iterator
{
bool hasNext();
Object next();
}
class TedIterator : Iterator
{
private List<string> items;
int position = 0;
public TedIterator(List<string> items)
{
this.items = items;
}
public bool hasNext()
{
if (position >= items.Count)
return false;
else
return true;
}
public object next()
{
string CurrentItem = items[position];
position++;
return CurrentItem;
}
}
class Ted_Devices
{
private List<string> items = new List<string>();
public Ted_Devices()
{
items.Add("Phone");
items.Add("Bag");
items.Add("Pad");
}
public Iterator CreateIterator()
{
return new TedIterator(items);
}
}
class PaulIterator : Iterator
{
private string[] items;
int position = 0;
public PaulIterator(string[] items)
{
this.items = items;
}
public bool hasNext()
{
if (position >= items.Length || items[position]==null)
return false;
else
return true;
}
public object next()
{
string CurrentItem = items[position];
position++;
return CurrentItem;
}
}
class Paul_Devices
{
private string[] items = new string[3];
public Paul_Devices()
{
items[0] = "Pencil";
items[1] = "Watch";
items[2] = "book";
}
public Iterator CreateIterator()
{
return new PaulIterator(items);
}
}
class Program
{
static void Main(string[] args)
{
Ted_Devices TD = new Ted_Devices();
Iterator TD_list = TD.CreateIterator();
Paul_Devices PD = new Paul_Devices();
Iterator PD_list = PD.CreateIterator();
Console.WriteLine("===Ted list====");
printDevice(TD_list);
Console.WriteLine("====Paul list====");
printDevice(PD_list);
Console.ReadLine();
}
private static void printDevice(Iterator obj)
{
while (obj.hasNext())
{
Console.WriteLine(obj.next());
}
}
}
Result:===Ted list====
Phone
Bag
Pad
====Paul list====
Pencil
Watch
book
從Main function就可以很清楚的看到 兩個人的collection List<string> 和 string[]都被轉為iterator
若有需要對data做進一步的處理 他們可以使用相同的寫法(printDevice) 去印出他們身上的device
若有進一步的處理 也可以使用同樣一套寫法 (不需要用if else去區分是誰的device)
這樣子在maintain以及開發上就會相對輕鬆許多
沒有留言:
張貼留言