Шаблон дизайна редакции режимов - PullRequest
0 голосов
/ 04 июля 2011

Хотелось бы получить идеи о том, как работает режим редакции программы.Я имею в виду шаблоны для создания приложения с различным поведением, определяемым выбранным режимом, например, режимами в редакторах изображений.Давайте приведем пример: у меня есть приложение, которое позволяет мне размещать блоки и связывать их вместе стрелками.Поэтому я могу использовать режим перемещения блоков, режим удаления блоков и / или стрелок, я могу выбрать создание ссылок между блоками или редактирование блоков.Так что моя идея для каждого типа поведения, который я хочу, чтобы я выбрал кнопку на панели инструментов.При нажатии на любую из кнопок поведение ввода мыши обрабатывается в соответствии с тем, что мне нужно.

Ответы [ 2 ]

0 голосов
/ 06 июля 2011

Государственный паттерн идеально подходит для такой работы.

0 голосов
/ 05 июля 2011

Я постараюсь дать объяснение приведенному вами примеру (спасибо за это).Дайте мне знать, если я что-то упустил.

Я бы смоделировал abstract class Tool, который обеспечивает общий протокол, которого должны придерживаться все инструменты.Это сообщение для моделирования акта использования инструмента и другое для моделирования акта его высвобождения (точно так же, как когда вы используете карандаш, вы опираетесь на поверхность, используете его и снова поднимаете его).Что-то вроде RestOn и RaiseUp.

Вам нужно будет работать с Element s под инструментом (либо Block s или Link s), и назначить класс ответственностичтобы вы знали, какой элемент находится под указателем инструмента.Это может быть класс Canvas.

Затем можно реализовать определенное поведение инструмента, создав дерево наследования из Tool (Hand Tool, EraseTool и т. Д.).

Для интеграции с кнопками панели инструментов я бы сделал следующее: Определите статический метод / свойство в классе Tool, который предоставляет уникальный экземпляр каждого инструмента (одноэлементный шаблон):

abstract class Tool {
    abstract void RestOn...
    abstract void RaiseUp...

    static Tool HandTool() { return _handTool; }
    static Tool EraseTool() { return _eraseTool; }
    ....
}

Затем вУ обработчиков кнопок на панели инструментов у вас будет что-то вроде

btnHandTool_click(...) {
    _canvas.SetActiveTool(Tool.HandTool());
}

btnEraseTool_click(...) {
    _canvas.SetActiveTool(Tool.EraseTool());
}
...

Тот факт, что каждый инструмент является полиморфным по отношению к абстрактному классу Tool, позволит вам забыть о написании определенного кода, чтобы сказать, является ли активный инструментявляется экземпляром HandTool или EraseToolВы можете посмотреть, как меняется стратегия (шаблон) активного инструмента канвы.Внутри класс не может сказать, используется ли активный инструмент.Он знает только о сообщениях, на которые может отвечать.

Наконец, но очень важно, вы найдете в превосходной книге Ребекка Вирфс-Брок с именем Проектирование объектно-ориентированного программного обеспечения глава, посвященная созданию приложения для рисования с набором инструментов, показывающих различные методы, которые вы можете использовать для моделирования.Я рекомендую вам взять его и посмотреть, оно действительно стоит времени.

...