Erich Gamma Ralph Johnson Richard Helm John Vlissides Addison-Wesley



Download 6,32 Mb.
Pdf ko'rish
bet64/273
Sana02.03.2022
Hajmi6,32 Mb.
#479589
1   ...   60   61   62   63   64   65   66   67   ...   273
Bog'liq
Priemioop

Класс Iterator и его подклассы
Мы применим абстрактный класс Iterator для определения общего интерфей-
са доступа и обхода. Конкретные подклассы вроде Arraylterator и List Iterator
реализуют данный интерфейс для предоставления доступа к массивам и спис-
кам, а такие подклассы, как Preorderlterator, Postorderlterator и им по-
добные, реализуют разные виды обходов структур. Каждый подкласс класса
Iterator содержит ссылку на структуру, которую он обходит. Экземпляры под-
класса инициализируются этой ссылкой при создании. На рис. 2.13 показан класс


Правописание и расстановка переносов
Рис. 2. 13. Класс Iterator и его подклассы
Iterator и несколько его подклассов. Обратите внимание, что мы добавили
в интерфейс класса Glyph абстрактную операцию Createlterator для поддерж-
ки итераторов.
Интерфейс итератора предоставляет операции First, Next и IsDone для
управления обходом. В классе Listlterator реализация операции First ука-
зывает на первый элемент списка, a Next перемещает итератор на следующий эле-
мент. Операция IsDone возвращает признак, говорящий о том, перешел ли ука-
затель за последний элемент списка. Операция Cur rent It em разыменовывает
итератор для возврата глифа, на который он указывает. Класс Array Iterator
делает то же самое с массивами глифов.
Теперь мы можем получить доступ к потомкам в структуре глифа, не зная ее
представления:
Glyph* g;
Iterator* i = g->CreateIterator();
for (i->First(); !i->IsDone(); i->Next()) {
Glyph* child = i->Current!tem();
// выполнить действие с потомком
}
Createlterator по умолчанию возвращает экземпляр N u l l l t e r a t o r .
Nulllterator - это вырожденный итератор для глифов, у которых нет потом-
ков, то есть листовых глифов. Операция IsDone для Nulllterator всегда воз-
вращает истину.


Подкласс глифа, имеющего потомков, замещает операцию Createlterator
так, что она возвращает экземпляр другого подкласса класса Iterator. Какого
именно - зависит от структуры, в которой содержатся потомки. Если подкласс Row
класса Glyph размещает потомков в списке, то его операция Createlterator бу-
дет выглядеть примерно так:
Iterator* Row::Createlterator () {
return new ListIterator(_children);
}
Для обхода в прямом и внутреннем порядке итераторы реализуют алгоритм
обхода в терминах, определенных для конкретных глифов. В обоих случаях ите-
ратору передается корневой глиф той структуры, которую нужно обойти. Итера-
торы вызывают Createlterator для каждого глифа в этой структуре и сохра-
няют возвращенные итераторы в стеке.
Например, класс Preorderlterator получает итератор от корневого глифа,
инициализирует его так, чтобы он указывал на свой первый элемент, а затем по-
мещает в стек:
void Preorderlterator::First () {
Iterator* i = _root->Create!terator();
if
(i) {
i - > F i r s t ( ) ;
_iterators.RemoveAll();
_iterators.Push(i);
}
}
Cur rent I tern должна будет просто вызвать операцию Cur rent It em для ите-
ратора на вершине стека:
Glyph* Preorderlterator::CurrentItem () const {
return
_ i t e r a t o r s . S i z e ( ) > 0 ?
_iterators.Top()->CurrentItem() : 0;
}
Операция Next обращается к итератору с вершины стека с тем, чтобы элемент,
на который он указывает, создал свой итератор, спускаясь тем самым по структу-
ре глифов как можно ниже (это ведь прямой порядок, не так ли?). Next устанав-
ливает новый итератор так, чтобы он указывал на первый элемент в порядке об-
хода, и помещает его в стек. Затем Next проверяет последний встретившийся
итератор; если его операция IsDone возвращает true, то обход текущего подде-
рева (или листа) закончен. В таком случае Next снимает итератор с вершины сте-
ка и повторяет всю последовательность действий, пока не найдет следующее не
полностью обойденное дерево, если таковое существует. Если же необойденных
деревьев больше нет, то мы закончили обход:
Проектирование редактора документов
Iterator* Row::CreateIterator () {
return new ListIterator(_children);
}



Download 6,32 Mb.

Do'stlaringiz bilan baham:
1   ...   60   61   62   63   64   65   66   67   ...   273




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish