Home Contact Us

Chain Of

Info Menu

Chain Of

In Object Oriented Design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects . Each processing object contains a set of logic that describes the types of command objects that it can handle, and how to pass off those that it cannot to the next processing object in the chain. A mechanism also exists for adding new processing objects to the end of this chain.

In a variation of the standard chain-of-responsibility model, some handlers may act as dispatchers, capable of sending commands out in a variety of directions, forming a tree of responsibility . In some cases, this can occur recursively, with processing objects calling higher-up processing objects with commands that attempt to solve some smaller part of the problem; in this case recursion continues until the command is processed, or the entire tree has been explored. An XML interpreter (parsed, but not yet executed) might be a fitting example.

This pattern promotes the idea of loose coupling, which is considered a programming best practice.

Examples

Java


The following Java code illustrates the pattern with the example of a logging class. Each logging handler decides if any action is to be taken at this log level and then passes the message on to the next logging handler. The output is:

          Writing to stdout: Entering function y. Writing to stdout: Step1 completed. Sending via e-mail: Step1 completed. Writing to stdout: An error has occurred. Sending via e-mail: An error has occurred. Writing to stderr: An error has occurred.
        

Note that this example should not be seen as a recommendation on how to write logging classes.

Also, note that in a 'pure' implementation of the chain of responsibility pattern, a logger would not pass responsibility further down the chain after handling a message. In this example, a message will be passed down the chain whether it is handled or not.

          
            import
          
          
            java.util.*
          
          
            ;
          
          
            abstract
          
          
            class
          
          Logger
          
            {
          
          
            public
          
          
            static
          
          
            int
          
          ERR
          
            =
          
          
            3
          
          
            ;
          
          
            public
          
          
            static
          
          
            int
          
          NOTICE
          
            =
          
          
            5
          
          
            ;
          
          
            public
          
          
            static
          
          
            int
          
          DEBUG
          
            =
          
          
            7
          
          
            ;
          
          
            protected
          
          
            int
          
          mask
          
            ;
          
          
            // The next element in the chain of responsibility
          
          
            protected
          
          Logger next
          
            ;
          
          
            public
          
          Logger setNext
          
            (
          
          Logger l
          
            )
          
          
            {
          
          next
          
            =
          
          l
          
            ;
          
          
            return
          
          l
          
            ;
          
          
            }
          
          
            public
          
          
            void
          
          message
          
            (
          
          
            String
          
          msg,
          
            int
          
          priority
          
            )
          
          
            {
          
          
            if
          
          
            (
          
          priority
          
            <=
          
          mask
          
            )
          
          
            {
          
          writeMessage
          
            (
          
          msg
          
            )
          
          
            ;
          
          
            }
          
          
            if
          
          
            (
          
          next
          
            !=
          
          
            null
          
          
            )
          
          
            {
          
          next.
          
            message
          
          
            (
          
          msg, priority
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            abstract
          
          
            protected
          
          
            void
          
          writeMessage
          
            (
          
          
            String
          
          msg
          
            )
          
          
            ;
          
          
            }
          
          
            class
          
          StdoutLogger
          
            extends
          
          Logger
          
            {
          
          
            public
          
          StdoutLogger
          
            (
          
          
            int
          
          mask
          
            )
          
          
            {
          
          
            this
          
          .
          
            mask
          
          
            =
          
          mask
          
            ;
          
          
            }
          
          
            protected
          
          
            void
          
          writeMessage
          
            (
          
          
            String
          
          msg
          
            )
          
          
            {
          
          
            System
          
          .
          
            out
          
          .
          
            println
          
          
            (
          
          
            "Writing to stdout: "
          
          
            +
          
          msg
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            class
          
          EmailLogger
          
            extends
          
          Logger
          
            {
          
          
            public
          
          EmailLogger
          
            (
          
          
            int
          
          mask
          
            )
          
          
            {
          
          
            this
          
          .
          
            mask
          
          
            =
          
          mask
          
            ;
          
          
            }
          
          
            protected
          
          
            void
          
          writeMessage
          
            (
          
          
            String
          
          msg
          
            )
          
          
            {
          
          
            System
          
          .
          
            out
          
          .
          
            println
          
          
            (
          
          
            "Sending via email: "
          
          
            +
          
          msg
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            class
          
          StderrLogger
          
            extends
          
          Logger
          
            {
          
          
            public
          
          StderrLogger
          
            (
          
          
            int
          
          mask
          
            )
          
          
            {
          
          
            this
          
          .
          
            mask
          
          
            =
          
          mask
          
            ;
          
          
            }
          
          
            protected
          
          
            void
          
          writeMessage
          
            (
          
          
            String
          
          msg
          
            )
          
          
            {
          
          
            System
          
          .
          
            err
          
          .
          
            println
          
          
            (
          
          
            "Sending to stderr: "
          
          
            +
          
          msg
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            public
          
          
            class
          
          ChainOfResponsibilityExample
          
            {
          
          
            public
          
          
            static
          
          
            void
          
          main
          
            (
          
          
            String
          
          
          
          args
          
            )
          
          
            {
          
          
            // Build the chain of responsibility
          
          Logger l,l1
          
            ;
          
          l1
          
            =
          
          l
          
            =
          
          
            new
          
          StdoutLogger
          
            (
          
          Logger.
          
            DEBUG
          
          
            )
          
          
            ;
          
          l1
          
            =
          
          l1.
          
            setNext
          
          
            (
          
          
            new
          
          EmailLogger
          
            (
          
          Logger.
          
            NOTICE
          
          
            )
          
          
            )
          
          
            ;
          
          l1
          
            =
          
          l1.
          
            setNext
          
          
            (
          
          
            new
          
          StderrLogger
          
            (
          
          Logger.
          
            ERR
          
          
            )
          
          
            )
          
          
            ;
          
          
            // Handled by StdoutLogger
          
          l.
          
            message
          
          
            (
          
          
            "Entering function y."
          
          , Logger.
          
            DEBUG
          
          
            )
          
          
            ;
          
          
            // Handled by StdoutLogger and EmailLogger
          
          l.
          
            message
          
          
            (
          
          
            "Step1 completed."
          
          , Logger.
          
            NOTICE
          
          
            )
          
          
            ;
          
          
            // Handled by all three loggers
          
          l.
          
            message
          
          
            (
          
          
            "An error has occurred."
          
          , Logger.
          
            ERR
          
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
        



Here another example of this pattern in java. In this example we have different roles, each having a fix purchase power limit and a successor. Everytime a user in a role receives a purchase request, when it's over his limit, he just passes that request to his successor.

The PurchasePower abstract class with the abstract method processRequest.

          
            import
          
          
            java.io.*
          
          
            ;
          
          
            abstract
          
          
            class
          
          PurchasePower
          
            {
          
          
            protected
          
          
            final
          
          
            double
          
          base
          
            =
          
          
            500
          
          
            ;
          
          
            protected
          
          PurchasePower successor
          
            ;
          
          
            public
          
          
            void
          
          setSuccessor
          
            (
          
          PurchasePower successor
          
            )
          
          
            {
          
          
            this
          
          .
          
            successor
          
          
            =
          
          successor
          
            ;
          
          
            }
          
          
            abstract
          
          
            public
          
          
            void
          
          processRequest
          
            (
          
          PurchaseRequest request
          
            )
          
          
            ;
          
          
            }
          
        


Four implementations of the abstract class above: Manager, Director, Vice President, President

          
            class
          
          ManagerPPower
          
            extends
          
          PurchasePower
          
            {
          
          
            private
          
          
            final
          
          
            double
          
          ALLOWABLE
          
            =
          
          10
          
            *
          
          base
          
            ;
          
          
            public
          
          
            void
          
          processRequest
          
            (
          
          PurchaseRequest request
          
            )
          
          
            {
          
          
            if
          
          
            (
          
          request.
          
            getAmount
          
          
            (
          
          
            )
          
          
            <
          
          ALLOWABLE
          
            )
          
          
            System
          
          .
          
            out
          
          .
          
            println
          
          
            (
          
          
            "Manager will approve $"
          
          
            +
          
          request.
          
            getAmount
          
          
            (
          
          
            )
          
          
            )
          
          
            ;
          
          
            else
          
          
            if
          
          
            (
          
          successor
          
            !=
          
          
            null
          
          
            )
          
          successor.
          
            processRequest
          
          
            (
          
          request
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            class
          
          DirectorPPower
          
            extends
          
          PurchasePower
          
            {
          
          
            private
          
          
            final
          
          
            double
          
          ALLOWABLE
          
            =
          
          20
          
            *
          
          base
          
            ;
          
          
            public
          
          
            void
          
          processRequest
          
            (
          
          PurchaseRequest request
          
            )
          
          
            {
          
          
            if
          
          
            (
          
          request.
          
            getAmount
          
          
            (
          
          
            )
          
          
            <
          
          ALLOWABLE
          
            )
          
          
            System
          
          .
          
            out
          
          .
          
            println
          
          
            (
          
          
            "Director will approve $"
          
          
            +
          
          request.
          
            getAmount
          
          
            (
          
          
            )
          
          
            )
          
          
            ;
          
          
            else
          
          
            if
          
          
            (
          
          successor
          
            !=
          
          
            null
          
          
            )
          
          successor.
          
            processRequest
          
          
            (
          
          request
          
            )
          
          
            ;
          
          
            }
          
          
            }
          
          
            class
          
          VicePresidentPPower
          
            extends
          
          PurchasePower
          
            {
          
          
            private
          
          
            final
          
          
            double
          
          ALLOWABLE
          
            =
          
          40
          
            *
          
          base
          
            ;
          
          
            public
          
          
            void
          
          processRequest
          
            (
          
          PurchaseRequest request
          
            )
          
          
            {
          
          
            if
          
          
            (
          
          reque
        

Chain rule - Wikipedia, the free encyclopedia

In calculus, the chain rule is a formula for the derivative of the composite of two functions. In intuitive terms, if a variable, y, depends on a second variable, u, which in turn ...

mo..

City Chain

Here is a flash in this page that you can't see.

mo..

Wallets / Chains - Accessories

Free Shipping on Any Order of $50 or More!

mo..

Chain - Wikipedia, the free encyclopedia

A chain is a series of connected links. This article is about the literal, physical chain. A chain may consist of two or more links. A chain is usually made of metal.

mo..

Custom Motorcycle Chains - Insane Chains

Unique custom motorcycle chains for your custom motorcycle, or sport bike. Available in painted or plated finishes. Custom colors are available on request.

mo..

BuyChains.com - The #1 Online Source for Custom-Made Jewelry Chains of ...

We Offer More Than 100 Styles of Jewelry Chain in Four Categories. Click on the "chain selection" link to view categories & entire ...

mo..

Chain Protection Services (NZ) Ltd

Chain Protection Services (NZ) Ltd, Christchurch, New Zealand ... is a private company with over 20 years experience in the chain industry specializing in snow, forestry and ...

mo..

Ramsey Products | Ramsey Silent Chain and Sprocket Solutions

Who We Are. For more than 85 years Ramsey Products has focused on helping customers with the selection and application of Silent Chain drives. Combine that experience and ...

mo..

Replacement Chain Saw Chains

uality replacement chainsaw chain for your all your chain saw parts and accessories needs.

mo..

Teleflex, chain, roller chain, conveyor chain, Sing triple speed chain ...

Manufacturer of chain, roller chain, conveyor chain, leaf chain, attachment chain.

mo..