一.介紹
迭代模式(iterator pattern)。屬於行為型模式。它提供一種方法順序訪問聚合物件中各個元素,而又不暴露該物件的內部表示。
二.實現
迭代模式是針對聚合物件使用的,一般使用聚合,有增刪改操作,也需要進行遍歷操作。如果聚合物件全實現這些功能,那根據單一職責原則,聚合物件就承擔了太多責任。迭代模式就是去實現遍歷聚合物件責任的方式,通俗理解,就是建立乙個迭代類,這個包含了整個聚合物件,由這個迭代類記錄當前聚合的當前位置以及去遍歷查詢這個聚合。下面實現的是標準的迭代器模式。
//抽象迭代器類
public
abstract
class
iterator
//具體迭代器類
public
class
concreteiterator : iterator
public
override
object
currentitem()
throw
newindexoutofrangeexception();
}public
override
object
first()
public
override
bool
isend()
public
override
object
next()
throw
newindexoutofrangeexception();
}}//
抽象聚合類
public
abstract
class
aggregate
//具體聚合類
public
class
concreteaggregate : aggregate
public
override
iterator getiterator()
public
intcount
}public
intthis[int
index]
set }}//
呼叫public
static
void main(string
args)
;
var aggregate = new
concreteaggregate();
int index = 0
;
foreach (var i in
arr)
var iterator =aggregate.getiterator();
console.writeline(iterator.first());
while (!iterator.isend())
}
在c#中,迭代模式的聚合介面和迭代器介面都已經存在,其中ienumerator介面是迭代器角色,ienumberable介面是抽象聚合角色。
publicclass person : ienumerable
public ienumeratorgetenumerator()
ienumerator ienumerable.getenumerator()
}public
class personienumerator : ienumerator
public
string
current
}object ienumerator.current =>current;
public
void
dispose()
public
bool
movenext()
public
void
reset()
}//呼叫public
static
void main(string
args)
); console.writeline(
"foreach demo:");
foreach (var p in
person)
console.writeline();
var ienumerator =person.getenumerator();
console.writeline(
"movenext demo:");
while
(ienumerator.movenext())
}
三.總結
優點:1.迭代模式使得訪問乙個聚合物件的內容而不用暴露它的內部表示,即迭代抽象。
2.迭代模式為遍歷不同的聚合結構提供了乙個統一的介面,從而支援了不同聚合結構可以使用同樣的演算法。
缺點:1.迭代模式使得在遍歷時更改聚合物件會出現異常,所以使用foreach語句只能進行遍歷,不能在遍歷時進行修改聚合中元素操作。
C 設計模式 迭代器模式
迭代器模式 iterator 提供一種方法順序訪問乙個聚合物件中各個元素,而又不暴露該物件的內部表示。迭代器模式結構圖 iterator迭代器抽象類 class iterator public virtual object first 0 virtual object next 0 virtual ...
C 設計模式 迭代器模式
迭代器模式 提供一種方法順序訪問乙個聚合物件中的各個元素,而又不暴露其內部的結構 每一種資料結構 包括自定義 遍歷自身內部的資料方式都是不同的。但是我們又希望和常規的遍歷方式一樣呼叫,就如for和foreach一樣遍歷。想要以相同的方式遍歷不同型別的聚合物件,首先就要有乙個相同的介面方法來統一獲取,...
設計模式 C 迭代器模式
sejimoshi.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include include include using namespace std class student long getid intgetage void setname string name void...