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.
