Presentation is loading. Please wait.

Presentation is loading. Please wait.

ITERATOR Патерн поведінки Доповідач: Пропой Ярослав Рецензент: Мельниченко Владислав 0/40 NEXTSTART.

Similar presentations


Presentation on theme: "ITERATOR Патерн поведінки Доповідач: Пропой Ярослав Рецензент: Мельниченко Владислав 0/40 NEXTSTART."— Presentation transcript:

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


Download ppt "ITERATOR Патерн поведінки Доповідач: Пропой Ярослав Рецензент: Мельниченко Владислав 0/40 NEXTSTART."

Similar presentations


Ads by Google