Projekt 8 - Iterator

Transkrypt

Projekt 8 - Iterator
Projekt 8 - Iterator
22 maja 2013
Wstęp
Następnym zachowawczym wzorcem projektowym jest iterator. Wyraża on
kolekcje oraz operacje wykonywane na nich w języku wzorców projektowych pozwala uzyskać sekwencyjny dostęp do kolejnych elementów kolekcji bez uzewnętrzniania wewnętrznej reprezentacji obiektu jak również udostępnia równoczesny, niezależny sposób na przebieganie po kolekcji dla wielu iteratorów.
Dzięki implementacji konkretnego interfejsu (rozszerzeniu klasy abstrakcyjnej)
iterator udostępnia jednakowe metody do przebiegania po różnych kolekcjach.
Abstrakcja iteratora, natomiast, udostępnia możliwość zmiany implementacji
kolekcji bez jakichkolwiek zmian w programie poza kolekcją.
Założenia:
• abstrakcyjna klasa kolekcji posiada metodę zwracającą swój abstrakcyjny
iterator
• abstrakcyjna klasa iteratora posiada następujące metody:
– zwróć pierwszy element kolekcji - First()
– zwróć kolejny element kolekcji - Next()
– zwróć aktualny obiekt - Current()
– czy przeszedłeś przez całą kolekcję - Done()
• konkretna klasa kolekcji posiada:
– pewną kolekcję (np. ArrayList)
– metodę bądz akcesor zwracający i ustawiający konkretny element
kolekcji - można użyć akcesora:
public o bjec t t h i s [ i n t index ]
{
get { return k o l e k c j a [ index ] ; }
s e t { k o l e k c j a . I n s e r t ( index , v a l u e ) ; }
}
1
– metodę zwracającą długość kolekcji
• konkretna klasa iteratora posiada:
– referencję na konkretną klasę kolekcji
– wskaźnik odpowiedzialny za aktualne położenie iteratora
– metodę (najlepiej konstruktor) podpinającą kolekcję
Wykorzystanie:
• równoczesny, bezpieczny dostęp do kolekcji w różnych miejscach w programie
• unifikacja metod dostępu do elementów różnych kolekcji
Rozszerzanie iteratora (iterator solidny), środowisko wielowątkowe:
• iterator można rozszerzyć o następujące metody:
– usuń element - Remove()
– wstaw element przed obecnym - InsertBefore(element)
– wstaw element po obecnym - InsertAfter(element)
• iterator posiadający te metody i działający stabilnie (dodanie elementu
nie kopiuje kolekcji, iterator nie wyląduje na obecnym obiekcie przy następnym kroku, itp.) jest solidny (robust)
• oczywiście zaimplementowanie tych metod to dopiero początek - teraz należy poinformować wszystkie iteratory o zmianie w kolekcji po wstawieniu
lub usunięciu elementu (może się tutaj przydać wzorzec obserwatora)
• kolejnym krokiem jest założenie zamków tak, aby operacje dodawania
i usuwania elementów działały deterministycznie, w przewidywalny sposób
2
Zadanie
Używamy iteratora do przechowywania wielomianów. Założenia:
1. Spełnione są założenia iteratora.
2. Należy stworzyć klasę Osoba (imię, nazwisko, data urodzenia).
3. Należy stworzyć klasę Lista będącą kolekcją osób.
4. Trzeba umożliwić zarządzanie elementami klasy Lista - dodawania i usuwanie elementów.
5. Następnie należy stworzyć iterator, który pozwoli przejść niniejszą strukturę.
6. Przy tworzeniu iteratora należy umożliwić określenie kolejności w jakiej
chcemy przechodzić listę osób:
• posortowaną rosnąco lub malejąco po imieniu,
• posortowaną rosnąco lub malejąco po nazwisku,
• posortowaną rosnąco lub malejąco po dacie urodzenia,
• ułożoną w kolejności dodawania elementów.
7. Dla uproszczenia można założyć, że od chwili utworzenia iteratora do końca jego wykorzystania obiekt po którym iteruje nie będzie zmieniany.
8. W programie należy pokazać niezależnie działanie dwóch (lub więcej) różnych iteratorów.
Termin oddania projektu
29 maja 2013 r.
3