Существует ли шаблон для распространения состояния конфигурации по графу объектов?

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

проблема

A это сложно. Чтобы избежать "объекта бога", часть логики выталкивается в B а также C,

А сейчас служит фасадом. Это зависит от B и C.

A -> B
  -> C

Однако у A есть данные конфигурации, которые нужны B и C. Поэтому мы должны синхронизировать данные.

b.value1 = a.value1
b.value2 = a.value2

c.value1 = a.value1
c.value2 = a.value2

Кроме того, B и C должны преобразовать данные, чтобы использовать его.

b.sum -> b.value1 + b.value2
b.doSomething -> b.sum() ...

c.sum -> c.value1 + c.value2
c.doSomethingElse -> c.sum() ...

Чтобы избежать написания дублирующего кода, мы переместили эти методы преобразования обратно в A.

a.sum -> a.value1 + a.value2

b.doSomething -> a.sum() ...
c.doSomethingElse -> a.sum() ...

Но это означает, что B и C теперь зависят от A, а не только от его данных.

A -> B -> A
  -> C -> A

И это приводит к круговой зависимости.

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

редактировать

Потратив последние пару часов, пытаясь сформулировать свои мысли в вопросе, я думаю, что, возможно, наткнулся на решение. Я думаю, что мне нужно сделать, это создать класс поставщика конфигурации D который передается в узлы, которые зависят от этой информации.

A -> B -> D
  -> C -> D
  -> D

Буду управлять value1 а также value2 и обеспечивает sum метод. D также имеет события, которые инициируются, когда значения1 и значение2 изменяются, так что зависимые узлы (A, B и C) могут реагировать на изменение.

Я думаю, что это решение работает, но я все равно хотел опубликовать в случае, если есть лучшее решение. Если это шаблон, который я ищу, как он называется? Шаблон "провайдер"? (Не путать с моделью провайдера ASP.NET!)

1 ответ

Решение

Вы ищете наблюдателя или посредника. проверить это на http://sourcemaking.com/design_patterns/observer

Другие вопросы по тегам