Zpo-11-wyk-Slajd30: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Bwalter (dyskusja | edycje)
Nie podano opisu zmian
 
Bwalter (dyskusja | edycje)
Nie podano opisu zmian
 
Linia 1: Linia 1:
==Iterator: struktura==
==Przykład 2==


[[Image:zpo-11-wyk-Slajd30.PNG|Iterator: struktura]]
[[Image:zpo-11-wyk-Slajd30.PNG|Przykład 2]]




Wzorzec Iterator składa się z dwóch klas abstrakcyjnych: Aggregate i Iterator, oraz dwóch klas konkretnych: ConcreteAggregate i ConcreteIterator. Wszystkie kolekcje są implementują interfejs Aggregate, tzn. posiadają metodę tworzącą iterator. Iterator, podobnie jak Aggregate, jest jedynie specyfikacją interfejsu, jaki każdy iterator musi posiadać. Klient, odwołując się do metody ''createIterator'' ''()'' w kolekcji, otrzymuje klasę implementującą interfejs Iterator. Dzięki temu klient nie zna konkretnej klasy implementacyjnej, a jedynie interfejs, do którego musi się odwoływać. Taka sytuacja ma miejsce np. w bibliotece Java Collections: każda kolekcji tworzy swój własny iterator, który jednak jest dostępny wyłącznie poprzez wspólny interfejs Iterator. W ten sposób mogą one być traktowane w jednolity sposób.
Drugi przykład jest bardziej skomplikowany i pokazuje, że realizacja tego przekształcenia może napotykać na problemy.


Iterator posiada wewnętrzny wskaźnik, który wskazuje na aktualny element kolekcji. Iteratory definiują podstawowe operacje pozwalające na sekwencyjny dostęp do wszystkich elementów dowolnej kolekcji: ''getFirst'' ''()'' – ustawiająca wskaźnik iteratora na początek kolekcji, ''getNext'' ''()'' – zwracająca kolejny element, ''hasNext'' ''()'' – sprawdzająca, czy kolejny element istnieje. W niektórych implementacjach iterator pozwala także na modyfikacje kolekcji, np. dodawanie i usuwanie elementów. Kolekcje o specyficznej strukturze, np. listy mogą udostępniać iteratory wykorzystujące wiedzę o tej strukturze, np. możliwość swobodnego dostępu do elementów kolekcji, zmiany kierunku trawersu kolekcji etc.
Tym razem w klasie Wydawnictwo są zdefiniowane dwie metody: ''wyznaczRegal'' ''(),'' która wskazuje, na którym regale powinno znaleźć się Wydawnictwo, oraz ''czyDuze'' ''(),'' określające rozmiar Wydawnictwa. Metody te są wykorzystane w konstruktorze klasy Książka, w którym wyznaczenie regału jest wykonywane tylko dla dużych Wydawnictw. Należy jednak zauważyć, że metoda ''czyDuze'' ''()'' jest pokryta w klasie Książka, co wskazuje, że metoda ''wyznaczRegal'' ''()'' jest wywoływana w nadklasie, natomiast metoda ''czyDuze'' ''()'' – lokalnie.  


Z uwagi na konieczność dostępu do elementów kolekcji, iterator musi posiadać prawo odwołania się do nich. W praktyce jest on zatem zwykle klasą zaprzyjaźnioną lub wewnętrzną kolekcji.
Taki graf wywołań powoduje, że nie można w prosty sposób przenieść fragmentu konstruktora Książki do klasy Wydawnictwo, ponieważ klasa ta posiada własną definicję metody ''czyDuze'' ''(),'' której nie można w takim wypadku zastosować.




[[zpo-11-wyk-Slajd29 | << Poprzedni slajd]] | [[zpo-11-wyk-toc|Spis treści ]] | [[zpo-11-wyk-Slajd31 | Następny slajd >>]]
[[zpo-11-wyk-Slajd29 | << Poprzedni slajd]] | [[zpo-11-wyk-toc|Spis treści ]] | [[zpo-11-wyk-Slajd31 | Następny slajd >>]]

Aktualna wersja na dzień 17:37, 4 lis 2006

Przykład 2

Przykład 2


Drugi przykład jest bardziej skomplikowany i pokazuje, że realizacja tego przekształcenia może napotykać na problemy.

Tym razem w klasie Wydawnictwo są zdefiniowane dwie metody: wyznaczRegal (), która wskazuje, na którym regale powinno znaleźć się Wydawnictwo, oraz czyDuze (), określające rozmiar Wydawnictwa. Metody te są wykorzystane w konstruktorze klasy Książka, w którym wyznaczenie regału jest wykonywane tylko dla dużych Wydawnictw. Należy jednak zauważyć, że metoda czyDuze () jest pokryta w klasie Książka, co wskazuje, że metoda wyznaczRegal () jest wywoływana w nadklasie, natomiast metoda czyDuze () – lokalnie.

Taki graf wywołań powoduje, że nie można w prosty sposób przenieść fragmentu konstruktora Książki do klasy Wydawnictwo, ponieważ klasa ta posiada własną definicję metody czyDuze (), której nie można w takim wypadku zastosować.


<< Poprzedni slajd | Spis treści | Następny slajd >>