2014-07-05 2 views
0

Я реализую шаблон проектирования команд, но моя команда должна запрашивать у пользователя имя файла. Я не уверен, как можно запросить его?Конструкция шаблона команды и взаимодействие с пользователем

Банда из четырех книг, похоже, затрагивает эту проблему, но я не совсем понятна. Ниже мой код (псевдокод должен быть правильным и написан на лету).

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? Он должен открыть File Explorer, и пользователь может выбрать имя файла?

Означает ли это, что это должно быть тесно соединено с окнами? Мой план состоит в том, чтобы использовать этот код как для Windows, так и для iOS, поэтому я хотел бы иметь развязанное решение.

+1

Просто спросите имя файла в отдельном окне перед, и передать его в команде в качестве параметра. –

+0

@ πάνταῥεῖ Но это будет означать, что средняя половина команды выполняется вне команды. Одна из целей команды - пакет и выполнить команду позже. – zar

+0

_'to package'_ что это значит? Команды IMHO должны быть настроены со всеми параметрами, которые им нужно выполнить, без дальнейшего взаимодействия. –

ответ

0

Чтобы минимизировать связь между вашей командой и окном, вы должны по крайней мере вставить слой абстракции между ними. Во многих реализациях 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 }