是否存在用于将配置状态传播到对象图的模式?

时间:2013-11-16 00:37:39

标签: dependency-injection circular-dependency god-object

我试图避免创建一个monster class,我注意到一个不那么好的模式,如果有人对这个问题有任何见解,那就很好奇。

问题

A很复杂。为了避免“上帝对象”,一些逻辑被推送到BC

A现在充当façade。这取决于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

这导致循环依赖。

我一直在研究依赖注入和工厂模式,这两个想法已经解决了很多问题,但是我很难理解如何创建一个object graph,其节点在运行时是可配置的。换句话说,我需要能够在运行时从外部更改特定节点或节点组的行为。在对象图中传播配置状态的最佳方法是什么?

修改

我花了最后几个小时试图将我的想法表达成一个问题,我想我可能偶然发现了一个解决方案。我认为我需要做的是创建一个配置提供程序类D,它将传递到依赖于此信息的节点中。

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

D管理value1value2并提供sum方法。当value1和value2发生变化时,D也会触发事件,以便依赖节点(A,B和C)可以响应变化。

我认为这个解决方案有效,但无论如何我想发布以防更好的解决方案。如果我正在寻找的模式,它叫什么? “提供者”模式? (不要与ASP.NET的provider model混淆!)

1 个答案:

答案 0 :(得分:1)

你正在寻找观察者或中介模式吗?在http://sourcemaking.com/design_patterns/observer

上查看