org.apache.hivemind.lib.util
Interface StrategyRegistry

All Known Implementing Classes:
StrategyRegistryImpl

public interface StrategyRegistry

An implementation of the strategy pattern. The strategy pattern allows new functionality to be assigned to an existing class. As implemented here, this is a smart lookup between a particular class (called the subject class) and some object instance that can provide the extra functionality (called the strategy). The implementation of the strategy is not relevant to the StrategyRegistry class.

Strategies are registered before they can be used; the registration maps a particular class to a strategy instance. The strategy instance will be used when the subject class matches the registered class, or the subject class inherits from the registered class.

This means that a search must be made that walks the inheritance tree (upwards from the subject class) to find a registered mapping.

In addition, strategies can be registered against interfaces. Searching of interfaces occurs after searching of classes. The exact order is:

The first match terminates the search.

The StrategyRegistry caches the results of search; a subsequent search for the same subject class will be resolved immediately.

StrategyRegistry does a minor tweak of the "natural" inheritance. Normally, the parent class of an object array (i.e., Foo[]) is simply Object, even though you may assign Foo[] to a variable of type Object[]. StrategyRegistry "fixes" this by searching for Object[] as if it was the superclass of any object array. This means that the search path for Foo[] is Foo[], Object[], then a couple of interfaces Cloneable, Serializable, etc. that are implicitily implemented by arrays), and then, finally, Object

This tweak doesn't apply to arrays of primitives, since such arrays may not be assigned to Object[].

Since:
1.1
Author:
Howard M. Lewis Ship
See Also:
StrategyRegistryImpl

Method Summary
 java.lang.Object getStrategy(java.lang.Class subjectClass)
          Gets the stategy object for the specified subjectClass.
 void register(java.lang.Class registrationClass, java.lang.Object strategy)
          Registers an adapter for a registration class.
 

Method Detail

register

void register(java.lang.Class registrationClass,
              java.lang.Object strategy)
Registers an adapter for a registration class.

Throws:
java.lang.IllegalArgumentException - if a strategy has already been registered for the given class.

getStrategy

java.lang.Object getStrategy(java.lang.Class subjectClass)
Gets the stategy object for the specified subjectClass.

Throws:
java.lang.IllegalArgumentException - if no strategy could be found.