Вы описываете причины, по которым традиционные модели MVC обычно состоят из хранилища данных и логики приложения. Если вы попытаетесь разделить их, вы столкнетесь с ситуацией, которую вы обдумываете.
Если вы беспокоитесь о том, что представления обращаются к тем вещам, которые им не нужны, вы всегда можете отправить им данные в событиях вместо того, чтобы читать их в ответ на событие. Читайте по шаблону Observer.
Вы также можете построить свою модель из вспомогательных классов (класса для состояния, которое создает экземпляр Observable, класса для логики и т. Д.) И создавать их как синглтоны в модели. Это, однако, не обязательно решает ваши желания по контролю доступа.
Третий вопрос связан с использованием «друзей», которые некоторые считают плохой ОО-конструкцией. Дизайнеры AS3 решили не использовать дружественные классы и методы как часть языка, такого как C ++.
Если у вас ее нет, книга шаблонов проектирования AS3 является хорошим справочником по распространенным способам решения распространенных проблем, подобных тем, которые вы описываете.
Я бы предложил заглянуть в PureMVC. Это не идеальная структура для всех ситуаций, но она предлагает некоторые решения проблем, которые вы описываете. В этом случае ваше игровое состояние может быть сохранено / доступно в одном прокси, а логика может / будет разделена между несколькими уведомлениями и командами. Некоторые люди считают, что фреймворки ограничивают, но я считаю, что хорошо спроектированная фреймворк позволяет мне сконцентрироваться на специфике приложения, а не на том, как реализовать основное поведение.