Разделение чертежа элемента GUI - PullRequest
2 голосов
/ 04 июня 2009

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

В данный момент Элемент смотрит на свое внутреннее состояние, если оно выбрано, и затем решает, как нарисовать себя.

graphic.drawImage(icon, x, y, null);
if (selected) {
    drawBorder();
}

Мне не нравится идея добавить еще один, если еще к этому методу рисования. Я думал о создании нового класса, который наследует поведение элемента и перезаписывает метод draw, но это означает дублирование всего выбранного кода в каждом унаследованном классе. Есть хорошая возможность, чтобы решить эту проблему, не создавая подкласс?

Ответы [ 3 ]

1 голос
/ 04 июня 2009

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

Будет ли это что-то, что может измениться? То есть Вы реально думаете, что собираетесь добавить новое поведение к чертежу (например, если пользователь дважды щелкает, рисует другой тип границы; если пользователь щелкает правой кнопкой мыши, меняет цвет границы), или это так? Если вы видите, что добавляется больше поведения, я думаю, что было бы разумно пойти дальше и принять более ОО-подход. Если это просто эти два случая, я бы сказал, просто добавить и else if заявление.

0 голосов
/ 04 июня 2009

одна из возможностей - разрешить методу drawBorder () принимать параметры:

private void drawBorder(boolean isSelected, boolean hasSpecialValue);

этот метод может определить, какой тип границы рисовать.

0 голосов
/ 04 июня 2009

Что вы имеете против if-else?

Для меня не имеет смысла создавать совершенно новый объект для выбранного элемента, чем проверять флаг в функции рисования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...