Use ChainedClosure
to create a
chain of Closure
instances that
appears as a single Closure
. A
ChainedClosure
takes an array of Closure
objects and passes the same object
sequentially to each Closure
in the
chain. This example sends an object through a ChainedClosure
containing two stages that
modify different properties on the object:
Closure fuel = new Closure( ) { public void execute(Object input) { Shuttle shuttle = (Shuttle) input; shuttle.setFuelPercent( 100.0 ); } } Closure repairShielding = new Closure( ) { public void execute(Object input) { Shuttle shuttle = (Shuttle) input; shuttle.setShieldingReady( true ); } } Closure[] cArray = new Closure[] { repairShielding, fuel }; Closure preLaunch = new ChainedClosure( cArray ); Shuttle endeavour = new Shuttle( ); endeavour.setName( "Endeavour" ); System.out.println( "Shuttle before preLaunch: " + shuttle ); preLaunch.execute( endeavour ); System.out.println( "Shuttle after preLaunch: " + shuttle );
A Shuttle
object is passed
through a ChainedClosure
, preLaunch
, which consists of the stages
fuel
and repairShielding
. These two Closure
objects each modify the internal state
of the Shuttle
object, which is
printed out both before and after the execution of the preLaunch
Closure
:
Shuttle before preLaunch: Shuttle Endeavour has no fuel and no shielding. Shuttle before preLaunch: Shuttle Endeavour is fueled and is ready for reentry.
This example should remind you of Recipe 4.11. When chaining
Transformer
objects, the result of
each transformation is passed between stages—the results of stage one
are passed to stage two, the results of stage two are passed to stage
three, and so on. A ChainedClosure
is
different; the same object is passed to each Closure
in sequence like a car moving through
a factory assembly line.