Я предлагаю вам рассмотреть модель актера .Это абстракция параллелизма, которая скрывает множество деталей, связанных с потоками, блокировками и т. Д.
Редактировать
Некоторые дополнительные комментарии, вызванные комментарием @ CMR ...
В модели актера я представляю, что приложение будет по-прежнему структурировано с использованием тех же компонентов, которые предложены в вопросе: Presentation
, ApplicationController
и т. Д. Разница с моделью актера заключается в том, что компоненты(сейчас актеры) не будут иметь прямых ссылок друг на друга.Скорее, они будут содержать каналы, на которые они могут публиковать асинхронные, неизменяемые сообщения друг другу.
Последовательность событий в случае «открыть файл» будет по существу такой же в модели актера, за исключением того, чтоканалы будут переданы в FileController
на шаге 2.3 вместо прямых ссылок на объекты.Точно так же регистрация наблюдателя происходит по каналам.
Так в чем же разница?Основное отличие состоит в том, что ни один код не должен быть ориентирован на потоки.Потоки невидимы для логики приложения, что является задачей структуры актера.Если можно следовать дисциплине, состоящей только в передаче неизменяемых объектов через каналы (которые применяются некоторыми структурами акторов), то практически вся сложная логика, связанная с синхронизацией потоков, исчезает.Конечно, нужно переключить образ мышления с модели синхронного программирования на асинхронную модель - не обязательно тривиальную задачу.Однако, по моему мнению, стоимость этого переключателя перевешивается тем, что не нужно думать о безопасности потоков (по крайней мере, в системах некоторой сложности).
В частности, в программировании пользовательского интерфейса, в асинхронных моделяхсделать намного проще, чтобы дать хороший отзыв пользователя.Например, элемент пользовательского интерфейса может запустить долгосрочное задание, отобразить сообщение «работает ...», а затем перейти в спящий режим.Некоторое время спустя приходит сообщение, дающее результаты долгосрочной задачи, которые вместо элемента «рабочий ...» отображает элемент пользовательского интерфейса.Аналогичным образом представления дерева можно строить постепенно, по мере того, как данные каждого узла дерева поступают во входящем сообщении.
Модель актера можно рассматривать как обобщение классического подхода «накачки событий» пользовательского интерфейса - за исключением того, чтокаждый компонент (субъект) одновременно запускает свой собственный насос событий, а не один насос, отправляющий кучу компонентов.Каркас Actor обеспечивает способ запуска большого или даже огромного количества таких «одновременных насосов» с очень низким уровнем накладных расходов.В частности, небольшое количество потоков (скажем, по одному на процессор) обслуживает большое количество действующих лиц.