Or a more modern example of this pattern is Java\'s Servlet FilterChain: Or JavaScript\'s DOM event chain: Each Flight Controller would implement an interface: interface FlightController { protected void handleEvent(Event e, FlightContollerChain chain); } Flight Controllers can then do whatever they need to do in handleEvent() and can optionally invoke FlightContollerChain.proceed(Event) to let downstream Flight Controllers have a chance to handle the event. E.g.: public class SharingFlightController : FlightController { protected void handleEvent(Event e, FlightContollerChain chain) { Console.WriteLine('Before downstream FlightContollers are invoked: event=' + event); chain.proceed(e); Console.WriteLine('After downstream FlightControllers are invoked because I like to share'); } } public class SelfishFlightController : FlightController { protected void handleEvent(Event e, EventChain chain) { Console.WriteLine('Before downstream FlightContollers: event=' + event); //chain.proceed(e); Console.WriteLine('Downstream FlightControllers never invoked because I got this...'); } } The only trick is setting up the order of the Flight Controllers; do we let the user define/adjust the order?