Насколько я понимаю, первое и главное: Контролер не должен знать о мышлении, ощущении, действии ...
Я вижу, у вас есть что-то вроде метода «Обновить» для контроллера, и (я полагаю) контроллер должен что-то делать в зависимости от текущего «мышления», «восприятия», «действия».
Для этого случая я бы добавил еще 3 компонента на уровне модели: «ThinkModel», «ActModel», «SenseModel». Они должны представлять состояние соответствующего процесса и ничего не знать о другом мире.
Ваш контроллер должен получать эту информацию от компонентов (мышление, поведение, восприятие) такими методами, как «DoAction», «ThinkingAbout», «FeelingSomething», и хранить ее внутри.
В то же время он должен иметь набор событий, таких как «ActionOccured», «ThinkingOccured», «SenseingOccured» (последний может быть сформулирован как «FeeledSomething»). Эти события должны быть:
- срабатывает в случае изменения какого-либо состояния;
- предоставить соответствующую объектную модель;
- должны прослушиваться компонентами.
В результате у вас будет контроллер, который будет знать только о моделях, и каждый компонент будет ссылаться на все модели И контроллер. Компоненты должны ничего не знать друг о друге. Контроллер ничего не должен знать о компонентах. И вы сможете создать свой объект следующим образом:
IThinkModel modelThinkg = new ThinkModel();
IActModel modelAct = new ActModel();
ISenseModel modelSense = new SenseModel();
IController controller = new Controller(modelThinkg, modelAct, modelSense);
ISenseNPC sense = new DefaultSenseNPC(controller);
IThinkNPC think = new DefaultThinkNPC(sense);
IActNPC act = new DefaultActNPC(combatEngine, sense, controller);
Конструктор каждого компонента может выглядеть так:
class DefaultSenseNPC
{
DefaultSenseNPC(IController controller)
{
_controller = controller;
_contoller.ThinkingAbout += ContollerReceivedNewThinking;
}
private ContollerReceivedNewThinking(IModelThinking modelNewThink)
{
_modelNewThink = modelNewThink;// store it for further calculations.
}
}
Надеюсь, это поможет.
P.S. В некотором смысле предлагаемая «архитектура» похожа на шаблон MVP, используемый в приложениях с пользовательским интерфейсом.