Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Паттерн итератор

Читайте также:
  1. Cборщики и итераторы
  2. Введение в паттерны проектирования
  3. Введение в паттерны проектирования
  4. Введение в паттерны проектирования
  5. Введение в паттерны проектирования
  6. Введение в паттерны проектирования
  7. Введение в паттерны проектирования
  8. Гдд Паттерны поведения
  9. Глава 1. Введение в паттерны проектирования
  10. Глава 3. Порождающие паттерны

Паттерн итератор абстрагирует описанную технику поддержки обхода струк­тур, состоящих из объектов, и доступа к их элементам. Он применим не только к составным структурам, но и к группам, абстрагирует алгоритм обхода и экрани­рует клиентов от деталей внутренней структуры объектов, которые они обходят. Паттерн итератор - это еще один пример того, как инкапсуляция изменяющейся сущности помогает достичь гибкости и повторной используемости. Но все равно проблема итерации оказывается глубокой, поэтому паттерн итератор гораздо сложней, чем было рассмотрено выше.

Обход и действия, выполняемые при обходе

Итак, теперь, когда у нас есть способ обойти структуру глифов, нужно занять­ся проверкой правописания и расстановкой переносов. Для обоих видов анализа необходимо аккумулировать собранную во время обхода информацию.

Прежде всего следует решить, на какую часть программы возложить ответ­ственность за выполнение анализа. Можно было бы поручить это классам Iterator, тем самым сделав анализ неотъемлемой частью обхода. Но решение стало бы бо­лее гибким и пригодным для повторного использования, если бы обход был отде­лен от действий, которые при этом выполняются. Дело в том, что для одного и того же вида обхода могут выполняться разные виды анализа. Поэтому один и тот же


Проектирование редактора документов

 


набор итераторов можно было бы использовать для разных аналитических опе­раций. Например, прямой порядок обхода применяется в разных случаях, вклю­чая проверку правописания, расстановку переносов, поиск в прямом направле­нии и подсчет слов.

Итак, анализ и обход следует разделить. Кому еще можно поручить анализ? Мы знаем, что разновидностей анализа достаточно много, и в каждом случае в те или иные моменты обхода будут выполняться различные действия. В зависимос­ти от вида анализа некоторые глифы могут оказаться более важными, чем другие. При проверке правописания и расстановке переносов мы хотели бы рассматри­вать только символьные глифы и пропускать графические - линии, растровые изображения и т.д. Если мы занимаемся разделением цветов, то желательно было бы принимать во внимание только видимые, но никак не невидимые глифы. Та­ким образом, разные глифы должны просматриваться разными видами анализа.

Поэтому данный вид анализа должен уметь различать глифы по их типу. Оче­видное решение - встроить аналитические возможности в сами классы глифов. Тогда для каждого вида анализа мы можно было добавить одну или несколько аб­страктных операций в класс Glyph и реализовать их в подклассах в соответствии с той ролью, которую они играют при анализе.

Однако неприятная особенность такого подхода состоит в том, что придется изменять каждый класс глифов при добавлении нового вида анализа. В некото­рых случаях проблему удается сгладить: если в анализе участвует немного классов или если большинство из них выполняют анализ одним и тем же способом, то мож­но поместить подразумеваемую реализацию абстрактной операции прямо в класс Glyph. Такая операция по умолчанию будет обрабатывать наиболее распростра­ненный случай. Тогда мы смогли бы ограничиться только изменениями класса Glyph и тех его подклассов, которые отклоняются от нормы.

Но, несмотря на то что реализация по умолчанию сокращает объем измене­ний, принципиальная проблема остается: интерфейс класса Glyph необходимо расширять при добавлении каждого нового вида анализа. Со временем такие опе­рации затемнят смысл этого интерфейса. Будет трудно понять, что основная цель глифа - определить и структурировать объекты, имеющие внешнее представле­ние и форму; в интерфейсе появится много лишних деталей.

Инкапсуляция анализа

Судя по всему, стоит инкапсулиро­вать анализ в отдельный объект, как мы уже много раз делали прежде. Можно было бы поместить механизм конкрет­ного вида анализа в его собственный класс, а экземпляр этого класса исполь­зовать совместно с подходящим итерато­ром. Тогда итератор «переносил» бы этот экземпляр от одного глифа к другому, а объект выполнял бы свой анализ для каждого элемента. По мере продвижения




Дата добавления: 2015-09-11; просмотров: 87 | Поможем написать вашу работу | Нарушение авторских прав

Проектирование редактора документов | Обязанность Операции | Оформление пользовательского интерфейса | Оформление пользовательского интерфейса | Поддержка нескольких стандартов внешнего облика | Поддержка нескольких оконных систем | Проектирование редактора документов | Подклассы Windowlmp | Операции пользователя | Операции пользователя |


lektsii.net - Лекции.Нет - 2014-2025 год. (0.007 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав