我试图避免创建一个monster class,我注意到一个不那么好的模式,如果有人对这个问题有任何见解,那就很好奇。
A
很复杂。为了避免“上帝对象”,一些逻辑被推送到B
和C
。
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管理value1
和value2
并提供sum
方法。当value1和value2发生变化时,D也会触发事件,以便依赖节点(A,B和C)可以响应变化。
我认为这个解决方案有效,但无论如何我想发布以防更好的解决方案。如果是我正在寻找的模式,它叫什么? “提供者”模式? (不要与ASP.NET的provider model混淆!)