Wzorzec projektowy iterator
Stronę tą wyświetlono już: 2543 razy
Opis wzorca projektowego iterator
Wzorzec projektowy iterator należy do wzorców czynnościowych. Jego celem jest udostępnienie jednolitego interfejsu umożliwiającego iterowanie po elementach znajdujących się wewnątrz danej klasy. W językach udostępniających pętle foreach istnieje możliwość zaimplementowania w swojej własnej klasie iteracji obsługiwanej przez tą pętlę poprzez dziedziczenie i obsłużenie odpowiedniego interfejsu. W C# jest to interfejs iEnumerable. W C++ sprawa wygląda nieco inaczej, gdyż w tym języku nie ma pętli foreach, lecz zasada pozostaje wbrew pozorom taka sama (zamiast foreach używa się do while.
Przykładowy diagram UML wzorca projektowego iterator
Na poniższym diagramie głównym elementem jest klasa Stack, która dziedziczy po interfejsie iIterative. Interfejs ten ma jedną metodę czysto wirtualną iterator, którą klasa Stack musi obsłużyć. Celem tejże metody jest zwrócenie interfejsu iIterator, który dziedziczony jest przez klasę StackIterator. Klasa ta (w tym przypadku) jest wykorzystywana w przebiegły skądinąd sposób do tworzenia elementów stosu klasy Stack.
W rozpatrywanym przypadku interfejs iIterative jest używany jako argument trzech funkcji iterujących po elementach stosu:
- sum - sumuje elementy stosu;
- write - wypisuje elementy stosu;
- average - zwraca średnią elementów stosu
Powyższe funkcje wykorzystują interfejs iIterative w celu pozyskania interfejsu iIterator, co z kolei umożliwia iterację po elementach stosu.
Przykładowa implementacja wzorca projektowego iterator w C++
- #include <iostream>
- class iIterator{
- public:
- virtual iIterator* next() = 0;
- virtual int getValue() const = 0;
- };
- class StackIterator : public iIterator{
- StackIterator* iter;
- int value;
- public:
- inline StackIterator(int value) : value(value), iter(NULL) {}
- inline StackIterator(int value, StackIterator* iter) : value(value), iter(iter) {}
- virtual iIterator* next(){
- return iter;
- }
- void push(int value){
- iter = new StackIterator(value, iter);
- }
- inline virtual int getValue() const {
- return value;
- }
- virtual ~StackIterator(){
- std::cout << "Delete iter: " << value << std::endl;
- if(iter){
- delete iter;
- iter = NULL;
- }
- }
- };
- class iIterative{
- public:
- virtual iIterator* iterator() = 0;
- };
- class Stack : public iIterative{
- StackIterator* root;
- public:
- inline Stack() : root(NULL){}
- void addValue(int value){
- if(root){
- root->push(value);
- }else{
- root = new StackIterator(value);
- }
- }
- virtual iIterator* iterator(){
- return root;
- }
- ~Stack(){
- if(root){
- delete root;
- }
- }
- };
- void write(iIterative* iterative){
- iIterator* iter = iterative->iterator();
- if(iter){
- do{
- std::cout << "Iter: " << iter->getValue() << std::endl;
- }while(iter = iter->next());
- }
- }
- int sum(iIterative* iterative){
- int s = 0;
- iIterator* iter = iterative->iterator();
- if(iter){
- do{
- s += iter->getValue();
- }while(iter = iter->next());
- }
- return s;
- }
- float average(iIterative* iterative){
- float a = 0;
- int n = 0;
- iIterator* iter = iterative->iterator();
- if(iter){
- do{
- a += iter->getValue();
- n++;
- }while(iter = iter->next());
- }
- return a / n;
- }
- int main(){
- Stack stack;
- stack.addValue(100);
- stack.addValue(400);
- stack.addValue(300);
- write(&stack);
- std::cout << "Sum of elements is: " << sum(&stack) << std::endl;
- std::cout << "Average of elements is: " << average(&stack) << std::endl;
- std::cin.get();
- return 0;
- }
Wynik działania powyższego kodu:
Iter: 100 Iter: 300 Iter: 400 Sum of elements is: 800 Average of elements is: 266.667

Tytuł:
Wzorce projektowe. Rusz głową! Tworzenie rozszerzalnego i łatwego w utrzymaniu oprogramowania obiektowego. Wydanie II
Autor:
Eric Freeman, Elisabeth Robson

Tytuł:
Wzorce projektowe w .NET Core 3. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk

Tytuł:
Wzorce projektowe. Elementy oprogramowania obiektowego wielokrotnego użytku
Autor:
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Tytuł:
Projektowanie interfejsów., Sprawdzone wzorce projektowe. Wydanie III
Autor:
Jenifer Tidwell, Charles Brewer, Aynne Valencia-Brooks

Tytuł:
Kubernetes. Wzorce projektowe. Komponenty wielokrotnego użycia do projektowania natywnych aplikacji chmurowych
Autor:
Bilgin Ibryam, Roland Huß

Tytuł:
Wzorce projektowe w .NET. Projektowanie zorientowane obiektowo z wykorzystaniem C# i F#
Autor:
Dmitri Nesteruk

Tytuł:
Programowanie zorientowane obiektowo. Wzorce projektowe. Wydanie II
Autor:
Alan Shalloway, James R. Trott

Tytuł:
Java EE 8. Wzorce projektowe i najlepsze praktyki
Autor:
Rhuan Rocha, Joao Purificacao

Tytuł:
Systemy reaktywne. Wzorce projektowe i ich stosowanie
Autor:
Roland Kuhn Dr., Brian Hanafee, Jamie Allen

Tytuł:
Adaptywny kod. Zwinne programowanie, wzorce projektowe i SOLID-ne zasady. Wydanie II
Autor:
Gary McLean Hall