Я пишу программу рисования.Мои основные классы:
class Workspace { Bitmap b; List<Command> undoList; }
class Command { void execute(); }
class ClearScreen extends Command
class BlurEffect extends Command
class View { Bitmap screen; }
class Interface
Объект рабочей области содержит растровое изображение, которое представляет состояние программы.Класс Command представляет шаблон Command для выполнения команд в рабочей области, где отмена работает путем сброса состояния рабочей области и воспроизведения старых команд.Объект интерфейса связывает кнопки пользователя с командами, и представление отображает состояние рабочего пространства на растровое изображение экрана.
Моя проблема заключается в представлении команд.Команда ClearScreen проста;он просто говорит рабочей области заполнить растровое изображение белым, и это происходит мгновенно.Команда BlurEffect является более сложной;Blurring принимает параметр, определяющий степень размытия экрана, выполнение может занять некоторое время, и пользователь обычно хочет попробовать несколько параметров размытия перед тем, как выбрать один (т. е. ему необходимо предварительно просмотреть, как будет выглядеть эффект размытия, перед тем как совершить коммит).Как я могу изменить вышеупомянутое, чтобы поддержать этот вид предварительного просмотра?
Лучшее, что я могу придумать, это расширить Command с помощью чего-то вроде:
class BlurCommand extends Command
{
void setBlurAmount(float x) ...
// View can use this to render a preview to the
// screen bitmap, where the workspace bitmap isn't modified in the process
void preview(Workspace w, Bitmap b)
void execute() // apply blur effect to workspace
}
Таким образом, идея в том, что в интерфейсе нажатие кнопки «размытия» создает новый объект BlurCommandзатем метод «рендеринга экрана» в View начнет вызывать метод «предварительного просмотра» для рендеринга экрана, а «execute» вызывается только тогда, когда пользователь хочет применить эффект.
Это самый чистый способ, которым я могу это сделать?Я пытаюсь придерживаться модели Model-View-Controller и не хочу, чтобы мое поведение предварительного просмотра усложняло ситуацию.