Не получается красиво разделить ответственности между компонентами. В игре есть несколько окон, между которыми возможен драг-н-дроп игровых предметов, причем по определенным правилам и только некоторые предметы. Окна — представление для различных наборов вещей игрока. Конкретно получается какая-то такая картинка правил взаимодействия:

В данном случае неважно, в какую сторону происходит драг-н-дроп: он реализован как swap, то есть симметричен.
Все было хорошо, пока окна образовывали пары, где можно было очевидным образом разделить ответственность, объявив одно окно источником, другое приемником и возложить на кого-то одного всю логику взаимодействия:

И это было тем более хорошо, так как в инвентаре игрока был реализован только интерфейс добавления и удаления вещей, а конкретные правила по торговле, надеванию или обмену реализовывались в классах, отвечающих за конкретные фичи. Как теперь разделить ответственность в таком графе — уже два дня ломаю голову. Был бы он полный, было бы проще.
Не хочется делать так, чтобы все окна (или модели) знали обо всех других, но все больше к этому склоняюсь: при получении игрового предмета проверяется его источник (опять-таки, кем конкретно?) и при наличии положительных правил для источника вызываются методы по дропу, обмену, удалению и тд. Или вообще централизованное решение с менеджером, управляющим правилами перетаскивания.
Что скажете? Как бы вы сделали? Прошу совета.