Currently I have three classes and respective interfaces and respective builders:
- Tree: the data structure (implemented in
SimpleTree
) - ProbabilityTree: is a
Tree
with added functionality to randomly select child nodes and to adjust the probability of selecting a node (implemented inProbabilityTreeImpl
). - DynamicTree: is a
ProbabilityTree
which dynamically constructs nodes when a requested node doesn't exist yet.
The client code needs Trees that support both random selection of nodes, as provided by ProbabilityTree
, and the tree dynamically growing when yet unexisting nodes are requested, as provided by DynamicTree
.
NOTE: Currently all three trees are immutable after having been build; for DynamicTree
this means clients cannot add or remove nodes, but the tree itself can automatically change.
NOTE: See Github gist with the five Java classes for the code.
There are at least two issues with this design:
DynamicTree
is derived fromProbabilityTree
, while conceptionally these two capabilities are unrelated (i.e. orthogonal).- Using inheritance to add functionally is often considered "bad design" (correct me if I'm wrong here).
An alternative design would be to decouple ProbabilityTree
and DynamicTree
using something similar to the decorator and/or adapter pattern. Using Java's dynamic Proxy might enable "decorators" that extend the interface and that can decorate other Tree
s with extended interfaces; i.e.:
TreeDecorator implements InvocationHandler, ... {
Tree adapted;
...
Object invoke(Method method, Object[] args) {
if( «this class can/should handle method» ) {
return method.invoke(this, args);
} else if ( «this.adapted can/should handle method» ){
return method.invoke(adapted, args);
}
};
}
Again there are some issue's:
- Using
Proxy
makes the code more difficult to understand.
What shall I do? Use inheritance to extend functionallity, use dynamic proxy, or something else?
DynamicTree
extendProbabilityTree
if they are unrelated? – vaughandroid Aug 14 '12 at 13:20ProbabilityTree
andDynamicTree
into a new interface? – vaughandroid Aug 14 '12 at 13:54DynamicTree
andProbabilityTree
concepts are unrelated when it sounds like you wantDynamicTree
to be a specialised type ofProbabilityTree
. Are you thinking that at some point you might have a variant ofDynamicTree
which isn't aProbabilityTree
? – vaughandroid Aug 14 '12 at 14:23