2016-08-04 4 views
0

Я встречаюсь с ситуацией, когда компонент A должен знать о состоянии компонента B, когда A запрашивает выполнение определенных действий (например, если меню редактирования переключено, действие сохранения на кнопке сохранения не должно выполняться). Мое приложение структурировано как дерево с вложенными компонентами.Что такое хороший шаблон для доступа к состояниям других компонентов?

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

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

3-я вещь, которую я пытаюсь использовать Singleton через инъекцию зависимости. Компоненты регистрируются в init для провайдера, и поставщик может быть введен для обеспечения доступа к другим компонентам.

3-й подход является самым легким и работает для меня. Но я google, что Синглтон не рекомендуется, поскольку это просто глобальная переменная, и он запутывает код. Но игровой движок Unity, похоже, имеет то же самое (FindComponentByTag). Какова общая практика для этого?

ответ

0

Стандартный шаблон для обработки таких вещей, как MVC (Model View Controller), который обычно использует шаблон Observer. Компоненты (я предполагаю, что у вас есть компоненты GUI) не должны напрямую обращаться к состоянию других компонентов. Вместо этого состояние должно обрабатываться моделью. Компоненты, которые должны знать о состоянии, регистрируются в качестве наблюдателей модели.

+0

Я вижу. Таким образом, контроллер будет иметь доступ ко многим моделям по своему усмотрению. При обновлении модели нажимают изменения на своих подписчиков (просматривать компоненты). Раньше я использовал библиотеки MVC, но никогда не думал, что в этом случае мне придется реализовать его, ха! Спасибо за ответ. – Flmhdfj

Смежные вопросы