// Chain of Responsibility // Minimum "pipes to" Total "pipes to" Average abstract class PipeAndFilter { private PipeAndFilter next; public PipeAndFilter( PipeAndFilter n ) { next = n; } public void processNumber( int in ) { if (next != null) next.processNumber( in ); } public void reportResults() { if (next != null) next.reportResults(); } } class Minimum extends PipeAndFilter { private int min = 999; public Minimum( PipeAndFilter n ) { super( n ); } public void processNumber( int in ) { if (in < min) min = in; super.processNumber( in ); } public void reportResults() { System.out.println( "minimum is " + min ); super.reportResults(); } } class Total extends PipeAndFilter { private int total = 0; public Total( PipeAndFilter n ) { super( n ); } public void processNumber( int in ) { total += in; super.processNumber( in ); } public void reportResults() { System.out.println( "total is " + total ); super.reportResults(); } } class Average extends PipeAndFilter { private int total = 0, count = 0; public Average( PipeAndFilter n ) { super( n ); } public void processNumber( int in ) { total += in; count++; super.processNumber( in ); } public void reportResults() { System.out.println( "average is " + ((double) total / count) ); super.reportResults(); } } public class ChainDemo { public static void main( String[] args ) { PipeAndFilter filters = new Minimum( new Total( new Average( null ) ) ); int[] input = { 10, 1, 9, 2, 8, 3, 7, 4, 6, 5 }; for (int i=0; i < input.length; i++) filters.processNumber( input[i] ); filters.reportResults(); } } // minimum is 1 // total is 55 // average is 5.5