2013-05-20 16 views
5

Definicja wzoru iteracyjnego: Zapewnia sposób dostępu do elementów obiektu zbiorczego sekwencyjnie bez ujawniania jego reprezentacji podstawowej. WikiDlaczego ujawnianie błędnych reprezentacji iteratorów jest złe?

Jakie są konsekwencje narażania podstawowej reprezentacji?

Aby uzyskać bardziej szczegółową odpowiedź: W jaki sposób zapobiega temu schemat iteratora?

+4

W skrócie, użytkownik (użytkownik) używa "Iteratora" w ten sam sposób dla 'ArrayList',' HashMap', 'HashSet',' TreeSet'. Nie dbasz o implementację za –

Odpowiedz

5

Jak na: http://www.oodesign.com/iterator-pattern.html

Ideą wzór iteratora jest wziąć odpowiedzialność dostępu i przechodzącej koryta przedmiotów kolekcji i umieścić go w obiekt iteratora. Obiekt iteratora będzie utrzymywać stan iteracji, śledzenie bieżącego elementu i sposób identyfikowania kolejnych elementów, które mają być iterowane.

Kilka korzyści, które można uzyskać z tego wzoru:

  1. Korzystanie Iterator kodu wzór projektant może zdecydować, czy zezwolić na 1 sposób iteracji (używając next() tylko) lub umożliwić odwrotną iteracji, jak również (stosując poprzednie() jak w ListIteratorze).
  2. Czy zezwolić na usuwanie obiektu, czy nie, jeśli tak, to w jaki sposób.
  3. Zachowaj wewnętrzne porządkowanie po zdjęciu obiektu.
  4. Umożliwia ujawnienie wspólnego mechanizmu przechodzenia przez kolekcję, zamiast oczekiwać od klientów zrozumienia podstawowych zbiorów.
1

W przypadku ujawnienia podstawowej reprezentacji kod klienta mógł się do niej przyłączyć. Następnie:

  • Jeśli reprezentacja się zmieni, może być konieczna zmiana całego sprzężenia kodu z nią.
  • Aby wykonać iterację na innym typie kontenera, może być konieczna zmiana powiązania kodu ze starym kontenerem.

Abstrakcja danych sprawia, że ​​kod jest bardziej odporny na zmiany w reprezentacji.

+0

czy możesz podać przykład każdego pocisku, o którym mówisz, tj. Byłoby wspaniale zobaczyć w działaniu te konsekwencje. – lmiguelvargasf

1

W skrócie: cały kod polegający na reprezentacji podstawowej zostanie zmieniony na pod numerem, jeśli zdecydujesz się zmienić reprezentację.

Na przykład, zdecydowałeś się najpierw użyć TreeMap, ale nie chcesz już zamawiać (w większości przypadków), więc zmienisz na HashMap. Ktoś przeplata twoją mapę, próbując zdobyć rosnącą listę. !!

Używając wzoru iteratora, zawsze możesz dać użytkownikowi możliwość przechodzenia przez coś z pewną logiką (lub po prostu losowo, co jest rodzajem logiki), nie wiedząc, co to jest pod maską.

Teraz, jeśli używasz HashMap zamiast , możesz odsłonić posortowany widok dla użytkownika.Jeśli podasz tę SortedIterator i powiesz użytkownikowi, że "używając tego, zagwarantujesz, że wynik zostanie posortowany, ale nie mogę powiedzieć ci nic o tym, co jest poniżej", możesz zmienić reprezentację tak, jak chcesz, o ile umowa tego SortedIterator jest przez Ciebie obsługiwany.

Powiązane problemy