Я реализую шаблон проектирования команд, но моя команда должна запросить у пользователя имя файла. Я не уверен, как команда может попросить об этом?
Банда из четырех книг, кажется, касается этой проблемы, но я не совсем уверен. Ниже мой код (псевдокод должен быть корректным и написанным на лету).
class OpenDocumentCommand : public Command
{
virtual char * AskUserForFileName();
virtual void Execute();
Application _App;
}
void OpenDocumentCommand::Execute()
{
char * fileName = AskUserForFileName();
_App.OpenDocument( fileName );
}
Теперь в типичном простом примере, AskUserForFileName()
может быть cin
а также cout
но как он может запросить имя файла в правильном приложении Windows? Он должен открыть проводник и пользователь может выбрать имя файла?
Значит ли это, что он должен быть тесно связан с окнами? Я планирую использовать этот код как на Windows, так и на iOS, поэтому я бы хотел развязать решение.
Чтобы свести к минимуму связь между вашей командой и окном, вы должны как минимум вставить между ними слой абстракции. Во многих реализациях MVVM вы можете найти «Modal Dialog» -интерфейс, который скрывает детали реализации окна от вызывающей ViewModel.
Этот интерфейс содержит по крайней мере один метод «ShowDialog ()», но он также может принимать ViewModel в качестве параметра и возвращает обратный вызов, чтобы сообщить вызывающей стороне, когда он закрывается пользователем.
Вот пример:
public interface IModalWindow
2 {
3 bool? DialogResult { get; set; }
4 event EventHandler Closed;
5 void Show();
6 object DataContext { get; set; }
7 void Close();
8 }