Передача данных через конструктор или установщик работает, но требует, чтобы создатель команды знал данные, необходимые для команды ...
Идея "контекста" действительно хороша, и я работал над (внутренней) структурой, которая использовала ее некоторое время назад.
Если вы настроили свой контроллер (компоненты пользовательского интерфейса, которые взаимодействуют с пользователем, CLI-интерпретатор пользовательских команд, сервлет-интерпретатор входящих параметров и данных сеанса и т. Д.) Для предоставления именованного доступа к доступным данным, команды могут напрямую запрашивать данные, которые они хочу.
Мне действительно нравится разделение, которое позволяет такая установка. Думайте о наслоении следующим образом:
User Interface (GUI controls, CLI, etc)
|
[syncs with/gets data]
V
Controller / Presentation Model
| ^
[executes] |
V |
Commands --------> [gets data by name]
|
[updates]
V
Domain Model
Если вы сделаете это «правильно», те же самые команды и модель представления могут использоваться с любым типом пользовательского интерфейса.
Если продвинуться дальше, то «контроллер» в приведенном выше примере довольно общий. Элементы управления пользовательского интерфейса должны знать только имя команды, которую они будут вызывать - им (или контроллеру) не нужно знать, как создать эту команду или какие данные нужны этой команде , Это реальное преимущество здесь.
Например, вы можете хранить имя команды для выполнения на карте. Всякий раз, когда компонент «запускается» (обычно это actionPerformed), контроллер ищет имя команды, создает его экземпляр, вызывает execute и помещает его в стек отмены (если вы его используете).