170 likes | 301 Vues
Iterator Pattern. Design Patterns in C#. www.devbg.org/patterns course /. Виктор Живков. Интерконсулт България. www.icb.bg. Съдържание. Цел на шаблона Проблем, който той решава Решение Следствия от употребата Имплементация Свързани шаблони Подобни шаблони. За шаблона.
E N D
Iterator Pattern Design Patterns in C# www.devbg.org/patternscourse/ Виктор Живков Интерконсулт България www.icb.bg
Съдържание • Цел на шаблона • Проблем, който той решава • Решение • Следствия от употребата • Имплементация • Свързани шаблони • Подобни шаблони
За шаблона • Предоставя начин за достъп до елементите на сложен обект, без да разкрива същинското му представяне • Дава възможност за множество видове обхождания на дадена структура от данни • Унифициран интерфейс за обхождане на различни структури от данни
Проблем • Обхождане само на определени елементи от списък (колекция) • Обхождане на обекти с връзка баща-син • Капсулиране на алгоритъма за обхождане • Лесна смяна на алгоритъма за обхождане
Роля на класовете • Iterator – дефинира интерфейс за достигане и обхождане на елементите • ConcreteIterator • Имплементира интерфейса на Iterator • Следи текущата позиция при обхождането на структурата от данни • Aggregate – дефинира интерфейс за създаване на обект Iterator • ConcreteAggregate – имплементира интерфейса за създаване на Iterator, който връща инстанция на съответния клас ConcreteIterator
Взаимодействие между класовете • Чрез ConcreteAggregate създаваме подходящ итератор (ConcreteIterator) • ConcreteIterator инстанцията следи за текущия елемент и може да изчислява следващия при обхождане
Имплементация Базовият Iterator: public interface IIterator { bool MoveNext(); object Current { get; } void Reset(); }
Имплементация ConcreteIterator клас: public class SimpleIterator : IIterator { object[] list; int currentIndex; public SimpleIterator(object[] values) {list = values; currentIndex = -1; } public bool MoveNext() { if (currentIndex < list.Length - 1) {currentIndex++; return true;} return false; } public object Current { get { if(currentIndex>-1 && currentIndex<list.Length) return list[currentIndex]; throw new ArgumentOutOfRangeException();} } public void Reset() { currentIndex = 0;} }
Имплементация ConcreteAggregator клас: public interface IIteratible { IIterator GetIterator(); } public class ConcreteAggregator : IIteratible { object[] list; public ConcreteAggregator(object[] values) { list = values; } public IIterator GetIterator() { GetIterator(iteratorType); } }
Демонстрация • Обхождане на масив по няколко различни начина
Препоръки • Имплементирайте IEnumerableза всяка ваша колекция • Използвайте интерфейси • Използвайте интерфейсите дефинирани в .NET Framework • Преценете дали да връщате nullили да хвърляте изключение, когато се опитате да достъпите невалиден елемент/индекс
Следствия • Поддържаме различни варианти за обхождане на дадена структура от данни • Опростяване на интерфейса на Aggregate • В даден момент можем да имаме повече от едно активно обхождане за дадена структура • Трудно можете да редактирате колекцията
Свързани шаблони • Composite – итераторите често се прилагат върху рекурсивни структури като композиции • Method Factory – използват се при полиморфичните итератори за създаване на нужния тип итератор • Memento – използва се за запазване на състоянието на итератора във вътрешна променлива
Упражнения • Запознайте се обстойно с имплементацията на IEnumerator и IEnumerable в .NET Framework. • Създайте итератор, който да ви позволява да обхождате обекти в масив, които са само от предварително зададен тип. Всички останали обекти да бъдат пропускани. • Реализирайте търсене на път между две клетки в матрица посредством шаблона итератор.
Design Patterns in C# Въпроси? www.devbg.org/patternscourse/
Използвана литература • Ерик Гама, Ричард Хелм, Ралф Джонсън, Джон Влисидес, Шаблони за дизайн, СофтПрес, 2005, ISBN 954-685-352-6