Вопрос

В таком инструменте, как Photoshop, есть выбор инструментов, на которые можно нажать (например, перо, кисть и т. д.). Нажав на инструмент, вы можете использовать этот инструмент для рисования, стирания и т. Д. В зависимости от того, какой инструмент выбран.

Мне интересно, как это лучше всего реализовать в ОО-дизайне. Я мог думать только о наличии GUIManager, который всегда знает, какой инструмент выбран, а затем, когда Canvas (область рисования) обнаруживает щелчок мыши или перетаскивание мыши, он спрашивает GUIManager, какой инструмент выбран, и применяет поведение этого инструмента.

Кто-нибудь описывает возможное решение в деталях на уровне класса (или в деталях, если у вас нет времени).

Это было полезно?

Решение

Ознакомьтесь с шаблоном состояний , в котором содержится именно ваш пример.

Однако на самом деле это не вопрос графического интерфейса, а скорее объектно-ориентированный подход к моделированию этой проблемы. GUI на самом деле не играет в этом.

Другие советы

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

Уровень сложности в приложении, которому требуется иерархия экранных меню & # 224; Фотошоп, вероятно, уменьшит разницу между композицией и наследованием, функциональным стилем и чем угодно.

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

Одной из идей для этого было бы иметь класс инструмента. Просто набросать это в C ++ - как псевдокод:

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

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

Это реализация шаблона состояния, на который ссылается Йоханнес.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top