Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
153
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

96

Мотивация

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

Реализовать класс Line легко, так как выполнения каких-либо сложных действий с линиями в программе не предусматривается. Совсем по-другому обстоит ситуация с классом TextShape. Реализовать в нем операции отображения и перемещения по рабочей области значительно сложнее. Можно было бы воспользоваться имеющимся классом TextView (условимся, что TextView приобретен у стороннего производителя элементов управления), в котором уже реализован необходимый функционал, позволяющий отображать текст нужным образом. В силу обстоятельств, класс TextView, не является производным от класса Shape, поскольку разрабатывался сторонними производителями, и его нельзя напрямую использовать в базовом классе редактора DrawingEditor.

Для организации использования класса TextView в данном проекте требуется изменить его интерфейс так, чтобы он соответствовал интерфейсу типа Shape. Так как класс TextView разрабатывался сторонними разработчиками, то доступ к его исходному коду может отсутствовать. Но, даже при наличии исходного кода, неразумно вносить в него изменения, поскольку нелогично подключаемые библиотеки приспосабливать к интерфейсу целевой программы. Правильным решением проблемы несовместимости интерфейсов, является адаптация интерфейса класса TextView к интерфейсу класса Shape. Такую адаптацию можно организовать следующим образом: при создании класса TextShape следует включить в него функциональность из класса TextView через использование композиции, при этом реализовать в классе TextShape интерфейс типа Shape. Реализация интерфейса типа Shape (в данном случае метода BoundingBox) в классе TextShape будет служить своеобразной оберткой над методом GetExtend из класса TextView. В таком случае класс TextShape будет выступать в роли адаптера (уровня объектов), и графический редактор сможет воспользоваться функциональностью класса TextView.

Зачастую, на практике адаптируемый класс не всегда предоставляет всю необходимую разработчикам функциональность, и в таком случае на класс-адаптер возлагается ответственность за добавление новой и расширение существующей функциональности. Класс TextView не предоставляет возможности перемещать текст по рабочей области, но класс TextShape, такую возможность может предоставить, через реализацию абстрактного метода CreateManipulator из базового класса Shape. Метод CreateManipulator возвращает экземпляр класса TextManipulator приведенный к базовому типу Manipulator. Абстрактный класс Manipulator – класс объектов, которым должно быть известно, как анимировать экземпляры объектов типа Shape, при их перетаскивании мышью по рабочей области окна. Для работы с каждым типом объектов производных от Shape (Line, TextShape) у класса Manipulator имеются подклассы LineManipulator и TextManipulator. Таким образом, объект класса TextShape расширяет возможности класса TextView, для его использования в приложении графического редактора.

См. Пример к главе: \006_Adapter\002_DrawingEditor

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]