У меня есть вопрос проектирования о связи между моделью и презентатором в шаблоне проектирования MVP - или, точнее, его производной форме пассивного представления .
Давайте предположим следующеепростой графический интерфейс в качестве примера: у меня есть окно, в котором мой вид представляет собой список, и есть возможность открыть диалоговое окно для выбора файла.Как только я закончу свой выбор, файл будет добавлен в список.
Моя модель должна быть коллекцией всех файлов, которые я открыл.
На ум приходит простая реализация (псевдо-код Python):
Решение A
class Model():
def add(filename):
# add file
...
# return True if successful
return True
class Presenter():
# event from GUI
def onFileOpen():
filename = FileSelectorStuff()
isFileAdded = model.add(filename)
if isFileAdded:
view.insertItem(filename)
В этом случае я знаю, что файл был добавлен в модель, и, таким образом, я соответствующим образом обновляю представление.
С другой стороны, я мог бы добавить файл в модель, а затем подождать, пока модель уведомит меня, что это изменилось, и что докладчик должен обновить представление следующим образом:
Решение B
class Model():
def add(filename):
# add file
...
# alert controller
modelChanged(Type.FileAdded, filename)
class Presenter():
# event from GUI
def onFileOpen():
filename = FileSelectorStuff()
model.add(filename)
# event from model
def onModelChanged(type, filename):
if type == Type.FileAdded:
view.insertItem(filename)
elif type == Type.FileRemoved:
...
Теперь в этом случае обе реализации работают просто отлично.Но давайте предположим, что модель также отслеживает файлы и должна сообщить докладчику, например, когда один из них был удален.Тогда мне все равно нужен такой механизм обратного вызова onModelChanged ().
Мой вопрос сейчас такой: Должен ли я смешать два способа обновления представления (A для синхронных обновлений и B для асинхронных) или, вернее, держите все это центральным в одном месте, как это предлагается в решении B?