Existe um padrão para propagar o estado de configuração em um gráfico de objeto?
-
21-12-2019 - |
Pergunta
Estou tentando evitar criar um classe monstro, e notei um padrão não tão bom e fiquei curioso para saber se alguém tinha alguma ideia sobre esse problema.
Problema
A
é complexo.Para evitar o “objeto deus”, parte da lógica é empurrada para B
e C
.
A agora serve como fachada.Depende de B e C.
A -> B
-> C
No entanto, A possui dados de configuração que B e C precisam.Portanto, temos que manter os dados sincronizados.
b.value1 = a.value1
b.value2 = a.value2
c.value1 = a.value1
c.value2 = a.value2
Além disso, B e C devem converter os dados para usá-los.
b.sum -> b.value1 + b.value2
b.doSomething -> b.sum() ...
c.sum -> c.value1 + c.value2
c.doSomethingElse -> c.sum() ...
Para evitar escrever código duplicado, movemos esses métodos de conversão de volta para A.
a.sum -> a.value1 + a.value2
b.doSomething -> a.sum() ...
c.doSomethingElse -> a.sum() ...
Mas isso significa que B e C agora dependem de A, não apenas de seus dados.
A -> B -> A
-> C -> A
E isso resulta em uma dependência circular.
Tenho estudado injeção de dependência e padrão de fábrica, e essas duas ideias resolveram muitos problemas, mas não sei como criar um gráfico de objeto cujos nós são configuráveis em tempo de execução.Em outras palavras, preciso da capacidade de alterar externamente o comportamento de um nó ou grupo de nós específico em tempo de execução.Qual é a melhor maneira de propagar o estado de configuração em um gráfico de objeto?
Editar
Depois de passar as últimas horas tentando formular meus pensamentos em uma pergunta, acho que encontrei uma solução.Acho que o que preciso fazer é criar uma classe de provedor de configuração D
que é passado para os nós que dependem dessas informações.
A -> B -> D
-> C -> D
-> D
D gerencia value1
e value2
e fornece o sum
método.D também possui eventos que são acionados quando o valor1 e o valor2 mudam para que os nós dependentes (A, B e C) possam responder à mudança.
Acho que essa solução funciona, mas queria postar mesmo assim, caso haja uma solução melhor.Se este é o padrão que procuro, como se chama?O padrão "provedor"?(Não deve ser confundido com o ASP.NET modelo de provedor!)
Solução
você está procurando um padrão de observador ou mediador.confira em http://sourcemaking.com/design_patterns/observer