Образец посредника или слишком большая ответственность - PullRequest
3 голосов
/ 19 мая 2009

В моем приложении у меня есть несколько компонентов, которые должны знать друг о друге, такие как строка меню и панель инструментов, которые оба должны знать о таблице, чтобы добавлять или удалять задания, а также узнавать, какое задание выбрано .

Итак, я создал объект с именем guiMediator, который я передаю каждому объекту, и они регистрируют его, чтобы они могли связаться друг с другом с помощью этого объекта. Он также ответственен за запуск событий, когда новые рабочие места добавляются или фоновые рабочие заканчивают свою работу.

Поскольку он много знает о системе, является ли этот тип использования слишком большой ответственностью в одном месте, или это правильное использование шаблона?

Ответы [ 3 ]

3 голосов
/ 19 мая 2009

Обычно я бы использовал шаблон команды для чего-то подобного:

  1. Пользователь нажимает кнопку «Foo» в строке меню, которая выполняет команду FooButtonClickedCommand.
  2. FooButtonClickedCommand делает все, что должен, затем соответствующим образом изменяет представление (строку меню, таблицы и т. Д.).

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

1 голос
/ 19 мая 2009

Я бы использовал пассивный просмотр, который вы можете прочитать о здесь .

  • Вы бы поместили каждую форму за интерфейс
  • Каждая форма будет регистрироваться с одним или несколькими объектами пользовательского интерфейса
  • Объект пользовательского интерфейса должен быть естественным образом организован, например, настройка, ввод, отображение и т. Д. У текстового процессора может быть только один объект пользовательского интерфейса для каждого документа. Хотя контроллер машины может иметь несколько объектов для каждого экрана.
  • Интерфейс реализован в виде тонких оболочек, которые передают события объектам пользовательского интерфейса и открывают элементы управления представлением, рисуя поверхности для объекта пользовательского интерфейса.
  • Затем UIObject получает данные и выясняет, какой объект команды выполнить
  • Объект Command обновит модель, а затем скажет одному или нескольким объектам пользовательского интерфейса обновить представление.
  • Объекты UIO обновляют представления.

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

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

Например, замена заменяемых на панели панелей вместо командных кнопок. Затем форма просто начнет передавать события нажатия на панели вместо кнопки. Форма может оставаться в неведении относительно фактической команды, которую должен выполнять каждый виджет. Об этом заботится UI Object.

0 голосов
/ 19 мая 2009

Звучит лучше, чем альтернатива ... Но эй, я вышла замуж за наименее уродливую сестру;

...