Download presentation
Presentation is loading. Please wait.
1
ITERATOR Патерн поведінки Доповідач: Пропой Ярослав Рецензент: Мельниченко Владислав 0/40 NEXTSTART
2
INTRO Патерн Iterator – це спосіб послідовного доступу до всіх елементів об’єкта – складника не порушуючи інкапсуляції. 1/40 NEXTPREV
3
MOTIVATION Пункт зверху Для підтримки різних активних обходів одного агрегованого об’єкту Для представлення єдиного інтерфейсу для обходу різних агрегованих структур 2/40 NEXTPREV
4
2 WAYS Хто керує Ітеруванням? Внутрішня ітерація. Зовнішня ітерація. 3/40 NEXTPREV
5
SIMPLE 4/40 NEXTPREV
6
SIMPLE 5/40 NEXTPREV
7
LIST //interface template class List { public: //велика трійка List (long size = DEFAULT_LIST_CAPACITY) long Count() const; Item & Get(long index) const; //... }; 6/40 NEXTPREV
8
ITERATOR //interface template class Iterator { public: virtual void First() = 0; virtual void Next() = 0; virtual void IsDone() const = 0; virtual void CurrentItem() const = 0; //… protected: Iterator(); }; 7/40 NEXTPREV
9
LISTITERATOR //interface template class ListIterator: public Iterator { public: ListIterator(const List * aList); virtual void First() ; virtual void Next() ; virtual bool IsDone() const ; virtual void CurrentItem() const ; private: const List * _list; long _current; }; 8/40 NEXTPREV
10
LISTITERATOR //implementation template void ListIterator ::First() {_current = 0;} template void ListIterator ::Next() {_current++;} template bool ListIterator ::IsDone() {return _current >= _list->Count();} 9/40 NEXTPREV
11
LISTITERATOR //implementation template void ListIterator ::CurrentItem() const { if ( IsDone() ) { throw IteratorOutOfBounds }; return _list -> Get(_current); } 10/40 NEXTPREV
12
INDEPENDENT 11/40 NEXTPREV
13
ABSTRACTLIST //interface template class AbstractList { public: virtual Iterator * CreateIterator const = 0; //... }; 12/40 NEXTPREV
14
LIST //implementation template Iterator * List :: CreateIterator () const { return new ListIterator (this); }; 13/40 NEXTPREV
15
main int main () { AbstractList * employees //... Iterator * iterator = employees -> CreateIterator(); //... return 0; }; 14/40 NEXTPREV
16
main int main () { AbstractList * employees //... Iterator * iterator = employees -> CreateIterator(); delete iteraror; return 0; }; 15/40 NEXTPREV
17
ITERATORPTR //implementation template class IteratorPtr { public: IteratorPtr( Iterator * i): _i(i){}; ~IteratorPtr( delete _i); Iterator * operator -> () { return _i}; Iterator & operator * () { return * _i}; private: Iterator * _i; IteratorPtr(const IteratorPtr&) IteratorPtr& operator = (const IteratorPtr&) }; 16/40 NEXTPREV
18
main //implementation int main () { AbstractList * employees //... IteratorPtr * iterator = employees -> CreateIterator(); //... delete iteraror; return 0; }; 17/40 NEXTPREV
19
INDEPENDENT 18/40 NEXTPREV
20
INDEPENDENT 19/40 NEXTPREV
21
LISTTRAVERSER //interface template class ListTraverser { public: ListTraverser(List * aList); bool Traverse(); protected: virtual bool PorcessItem(const Item&) = 0; private: ListIterator _iterator; }; 21/40 NEXTPREV
22
LISTTRAVERSER //implementation template ListTraverse :: ListTraverser(List * aList ): _iterator(aList) {}; template bool ListTraverser :: Traverse() { bool result = false; for (!_iterator.First();!_iterator.IsDone(); _iterator.Next()) – { – result = PorcessItem(_iterator.CurrentItem()); – if (result == false) { break}; – } return result; } 21/40 NEXTPREV
23
PRINTNEMPLOEES //interface class PrintNEmploees : public ListTraverser { public: PrintNEmploees(List * aList, int n): ListTraverser (aList), _total(n),_count(0) (); protected: bool PorcessItem (Employee* const&); private: int _total; int _count; }; 22/40 NEXTPREV
24
PRINTNEMPLOEES //implementation bool PrintNEmploees::PorcessItem(Employee* const& e) { _count++; e->Print(); return _count < _total; } 23/40 NEXTPREV
25
main int main() { List * employees; PrintNEmploees pa (employees,10); pa.Traverse; //OR ListIterator iterator (employees); count = 0; for (iterator.First();!iterator.IsDone(); iterator.Next()) { count++; iterator.CurrentItem()-> Print(); if (count>=10)) { break}; } return 0; } 24/40 NEXTPREV
26
ITERATOR(JAVA) public class ArrayList extends AbstractList { private int size; // … some metods public Iterator iterator() { return new Itr(); } private class Itr implements Iterator {} 25/40 NEXTPREV
27
ITERATOR(JAVA) private class Itr implements Iterator { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount; public boolean hasNext() { return cursor != size; } … 26/40 NEXTPREV
28
ITERATOR(JAVA) public E next(){ int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } // … } 27/40 NEXTPREV
29
PROBLEM for (A a : arrayListA) { // do something for (B b : arrayListB) { // do something for (C c : arrayListC) { // do something } 28/40 NEXTPREV
30
PROBLEM for (Iterator i = arrayListA.iterator(); i.hasNext();) { a = i.next(); } public Iterator iterator() { return new Itr(); } 29/40 NEXTPREV
31
PROBLEM for (A a : arrayListA) { // 100 обєктів for (B b : arrayListB) { // 100 * 100 обєктів for (C c : arrayListC) { // 100 * 100* 100 обєктів } 30/40 NEXTPREV
32
PROBLEM for (Iterator i = arrayListA.iterator(); i.hasNext();) { a = i.next(); } public Iterator iterator() { return new Itr(); } 31/40 NEXTPREV
33
PROBLEM for (int i = 0; i < arrayListA.size(); i++) { A a = arrayListA.get(i); } 32/40 NEXTPREV
34
MORE QUESTION Алгоритм обходу Привілеї Стійкість Додаткові операції 33/40 NEXTPREV
35
TRAVERSALITY Алгоритм обходу не обов'язково знаходиться власне у ітераторі Cursor Але.. 34/40 NEXTPREV
36
FRIENDLY С++ надає можливість надати привілейований доступ до атрибутів і це той випадок, коли актуально. 35/40 NEXTPREV
37
ROBUST Проблема зміни і додання Гарантія стійкості 36/40 NEXTPREV
38
MORE OPERATION Previous Skip To … 37/40 NEXTPREV
39
CONCLUSIONS Викоритсовувти ітератори по можливості 38/40 NEXTPREV
40
GRATITUDE Thank you for your attention! 39/40 NEXTPREV
41
REFERENCES Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидс. Приёмы объектно- ориентированного проектирования. Паттерны проектирования. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk /6-b14/java/util/ArrayList.java#ArrayList http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk /6-b14/java/util/ArrayList.java#ArrayList http://habrahabr.ru/post/164177/ 40/40 ENDPREV
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.