Chain-of-responsibility Pattern Research Materials







This page contains a list of user images about Chain-of-responsibility Pattern which are relevant to the point and besides images, you can also use the tabs in the bottom to browse Chain-of-responsibility Pattern news, videos, wiki information, tweets, documents and weblinks.

P!nk - Just Give Me A Reason ft. Nate Ruess
From the Grammy Nominated album The Truth About Love available now - http://smarturl.it/tal Music video by P!nk featuring Nate Ruess performing Just Give Me ...
Jack Sparrow (feat. Michael Bolton)
Buy at iTunes: http://goo.gl/zv4o9. New album on sale now! http://turtleneckandchain.com.
James Arthur sings Shontelle's Impossible - The Final - The X Factor UK 2012
Watch judges' comments at http://itv.com/XFactor (UK ONLY) Watch James Arthur sing Impossible by Shontelle Sweeeeet! As potential Winner's Singles go, this o...
THE LEGEND OF ZELDA RAP [MUSIC VIDEO]
WATCH BLOOPERS & MORE: http://bit.ly/ZELDAxtras DOWNLOAD THE SONG: http://smo.sh/13NrBp8 DOWNLOAD UNCENSORED SONG: http://smo.sh/WMYpsf GET LEGEND OF SMOSH T...
David Guetta - Titanium ft. Sia
From the album Nothing But The Beat Ultimate - Download on iTunes here: http://smarturl.it/NBTBiTunes?IQid=vevo Featuring Sia, Ne-Yo, Akon, Nicki Minaj, Flo ...
MACKLEMORE & RYAN LEWIS - THRIFT SHOP FEAT. WANZ (OFFICIAL VIDEO)
Thrift Shop on iTunes: http://itunes.apple.com/us/album/thrift-shop-feat.-wanz-single/id556955707 The Heist physical deluxe edition: http://www.macklemoremer...
Rihanna - Rehab ft. Justin Timberlake
Music video by Rihanna performing Rehab. YouTube view counts pre-VEVO: 19591123. (C) 2007 The Island Def Jam Music Group.
Kai and His Girlfriend, Ellen
The adorable 4-year-old crooner was back to put the moves on our host, and to make everybody in the audience melt. This kid is too adorable!
Threw It On The Ground
Download on iTunes: http://goo.gl/gcVR7 THREE T-Shirt designs!: http://goo.gl/jr4sY So many things to throw on the ground! Featuring Ryan Reynolds and Elijah...
Rihanna - Stay ft. Mikky Ekko
Download "Stay" from Unapologetic now: http://smarturl.it/UnapologeticDlx Music video by Rihanna performing Stay ft. Mikky Ekko. © 2013 The Island Def Jam Mu...
YOLO (feat. Adam Levine & Kendrick Lamar)
YOLO is available on iTunes now! http://smarturl.it/lonelyIslandYolo THE LONELY ISLAND - THE WACK ALBUM - JUNE 11th! Pre-order THE WACK ALBUM DIRECT: http://...
Epic Trick Shot Battle | Dude Perfect
Play the DUDE PERFECT GAME here! iPhone - http://bit.ly/DPGameiPhone Android - http://bit.ly/DPGameAndroid iPad - http://bit.ly/DPGameiPad Tweet! http://bit....
MACKLEMORE & RYAN LEWIS - CAN'T HOLD US FEAT. RAY DALTON (OFFICIAL MUSIC VIDEO)
Macklemore & Ryan Lewis present the official music video for Can't Hold Us feat. Ray Dalton. Can't Hold Us on iTunes: https://itunes.apple.com/us/album/cant-...
Drive Thru Invisible Driver Prank
Learn Magic at http://www.penguinmagic.com Instagram: http://instagram.com/themagicofrahat Twitter: http://twitter.com/magicofrahat Facebook Group: http://ww...
Draw My Life- Jenna Marbles
This video accidentally turned out kind of sad, ME SO SOWWY IT NOT POSED TO BE SAD WHO WANTS HUGS AND COOKIES? Also, FYI for anyone attempting this, it takes...
Rihanna - Diamonds
Pre-order new album Unapologetic, out worldwide Monday, November 19: http://smarturl.it/UnapologeticDlx Music video by Rihanna performing Diamonds. ©: The Is...
Rihanna - Pon de Replay (Internet Version)
Music video by Rihanna performing Pon de Replay. YouTube view counts pre-VEVO: 4166822. (C) 2005 The Island Def Jam Music Group.
Fitch, Please
Ellen weighed in on the conversation surrounding the policies of Abercrombie & Fitch.
Underwear Horoscopes
Please subscribe to my channel and my vlog channel! I make new videos here every Wednesday and make vlogs during my majestical daily life. JennaMarbles Jenna...
Giant 6ft Water Balloon - The Slow Mo Guys
Follow on Twitter! - https://twitter.com/#!/GavinFree Watch this one in HD! The slow mo guys are well aware that water balloons are always good in slow motio...

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 logic that defines the types of command objects that it can handle; the rest are passed 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 might work in this manner.

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

Contents

Example [edit]

The following code illustrates the pattern with the example of a logging class. Each logging handler acts as the processing object. Each handler decides if any action is to be taken at this log level and then passes the message on to the next logging handler. 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 processing object may not pass responsibility further down the chain after handling a message. But in this example, a message will be passed down the logger chain whether it is handled or not. Its behavior allows to log to both stdout and to an e-mail address.

Java [edit]

package chainofresp;
 
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 void setNext(Logger log) {
        next = log;
    }
 
    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 {
 
    private static Logger createChain() {
        // Build the chain of responsibility
 
        Logger logger = new StdoutLogger(Logger.DEBUG);
 
        Logger logger1 = new EmailLogger(Logger.NOTICE);
        logger.setNext(logger1);
 
        Logger logger2 = new StderrLogger(Logger.ERR);        
        logger1.setNext(logger2);
 
        return logger;
    }
 
    public static void main(String[] args) {
 
        Logger chain = createChain();
 
        // Handled by StdoutLogger (level = 7)
        chain.message("Entering function y.", Logger.DEBUG);
 
        // Handled by StdoutLogger and EmailLogger (level = 5)
        chain.message("Step1 completed.", Logger.NOTICE);
 
        // Handled by all three loggers (level = 3)
        chain.message("An error has occurred.", Logger.ERR);
    }
 
}
/*
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.
*/

C# [edit]

using System;
using System.IO;
 
namespace ChainOfResponsibility
{
    public enum LogLevel
    {
        Info=1,
        Debug=2,
        Warning=4,
        Error=8,
        FunctionalMessage=16,
        FunctionalError=32,
        All = 63
    }
 
    /// <summary>
    /// Abstract Handler in chain of responsibility Pattern
    /// </summary>
    public abstract class Logger
    {
        protected LogLevel logMask;
 
        // The next Handler in the chain
        protected Logger next;
 
        public Logger(LogLevel mask)
        {
            this.logMask = mask;
        }
 
        /// <summary>
        /// Sets the Next logger to make a list/chain of Handlers
        /// </summary>
        public Logger SetNext(Logger nextlogger)
        {
            next = nextlogger;
            return nextlogger;
        }
 
        public void Message(string msg, LogLevel severity)
        {
            if ((severity & logMask) != 0)
            {
                WriteMessage(msg);
            }
            if (next != null)
            {
                next.Message(msg, severity);
            }
        }
 
        abstract protected void WriteMessage(string msg);
    }
 
    public class ConsoleLogger : Logger
    {
        public ConsoleLogger(LogLevel mask)
            : base(mask)
        { }
 
        protected override void WriteMessage(string msg)
        {
            Console.WriteLine("Writing to console: " + msg);
        }
    }
 
    public class EmailLogger : Logger
    {
        public EmailLogger(LogLevel mask)
            : base(mask)
        { }
 
        protected override void WriteMessage(string msg)
        {
            //Placeholder for mail send logic, usually the email configurations are saved in config file.
            Console.WriteLine("Sending via email: " + msg);
        }
    }
 
    class FileLogger : Logger
    {
        public FileLogger(LogLevel mask)
            : base(mask)
        { }
 
        protected override void WriteMessage(string msg)
        {
            //Placeholder for File writing logic
            Console.WriteLine("Writing to Log File: " + msg);
        }
    }
 
    public class Program
    {
        public static void Main(string[] args)
        {
            // Build the chain of responsibility
            Logger logger, logger1, logger2;
            logger = new ConsoleLogger(LogLevel.All);
            logger1 = logger.SetNext(new EmailLogger(LogLevel.FunctionalMessage | LogLevel.FunctionalError));
            logger2 = logger1.SetNext(new FileLogger(LogLevel.Warning | LogLevel.Error));
 
            // Handled by ConsoleLogger
            logger.Message("Entering function ProcessOrder().", LogLevel.Debug);
            logger.Message("Order record retrieved.", LogLevel.Info);
 
            // Handled by ConsoleLogger and FileLogger
            logger.Message("Customer Address details missing in Branch DataBase.", LogLevel.Warning);
            logger.Message("Customer Address details missing in Organization DataBase.", LogLevel.Error);
 
            // Handled by ConsoleLogger and EmailLogger
            logger.Message("Unable to Process Order ORD1 Dated D1 For Customer C1.", LogLevel.FunctionalError);
 
            // Handled by ConsoleLogger and EmailLogger
            logger.Message("Order Dispatched.", LogLevel.FunctionalMessage);
        }
    }
}
 
/* Output
Writing to console: Entering function ProcessOrder().
Writing to console: Order record retrieved.
Writing to console: Customer Address details missing in Branch DataBase.
Writing to Log File: Customer Address details missing in Branch DataBase.
Writing to console: Customer Address details missing in Organization DataBase.
Writing to Log File: Customer Address details missing in Organization DataBase.
Writing to console: Unable to Process Order ORD1 Dated D1 For Customer C1.
Sending via email: Unable to Process Order ORD1 Dated D1 For Customer C1.
Writing to console: Order Dispatched.
Sending via email: Order Dispatched.
*/

Another Java Example [edit]

Below is another example of this pattern in Java. In this example we have different roles, each having a fixed purchasing limit and a successor. Every time a user in a role receives a purchase request that exceeds his or her limit, the request is passed to his or her successor.

The PurchasePower abstract class with the abstract method processRequest.

abstract class PurchasePower {
    protected static 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 (request.getAmount() < ALLOWABLE) {
            System.out.println("Vice President will approve $" + request.getAmount());
        } else if (successor != null) {
            successor.processRequest(request);
        }
    }
}
 
class PresidentPPower extends PurchasePower {
    private final double ALLOWABLE = 60 * BASE;
 
    public void processRequest(PurchaseRequest request) {
        if (request.getAmount() < ALLOWABLE) {
            System.out.println("President will approve $" + request.getAmount());
        } else {
            System.out.println( "Your request for $" + request.getAmount() + " needs a board meeting!");
        }
    }
}


The following code defines the PurchaseRequest class that keeps the request data in this example.

class PurchaseRequest {
    private int number;
    private double amount;
    private String purpose;
 
    public PurchaseRequest(int number, double amount, String purpose) {
        this.number = number;
        this.amount = amount;
        this.purpose = purpose;
    }
 
    public double getAmount() {
        return amount;
    }
    public void setAmount(double amt)  {
        amount = amt;
    }
 
    public String getPurpose() {
        return purpose;
    }
    public void setPurpose(String reason) {
        purpose = reason;
    }
 
    public int getNumber(){
        return number;
    }
    public void setNumber(int num) {
        number = num;
    }   
}


In the following usage example, the successors are set as follows: Manager -> Director -> Vice President -> President

class CheckAuthority {
    public static void main(String[] args) {
        ManagerPPower manager = new ManagerPPower();
        DirectorPPower director = new DirectorPPower();
        VicePresidentPPower vp = new VicePresidentPPower();
        PresidentPPower president = new PresidentPPower();
        manager.setSuccessor(director);
        director.setSuccessor(vp);
        vp.setSuccessor(president);
 
        // Press Ctrl+C to end.
        try {
            while (true) {
                System.out.println("Enter the amount to check who should approve your expenditure.");
                System.out.print(">");
                double d = Double.parseDouble(new BufferedReader(new InputStreamReader(System.in)).readLine());
                manager.processRequest(new PurchaseRequest(0, d, "General"));
           }
        } catch(Exception e) {
            System.exit(1);
        }  
    }
}

Implementations [edit]

Cocoa and Cocoa Touch [edit]

The Cocoa and Cocoa Touch frameworks, used for OS X and iOS applications respectively, actively use the chain-of-responsibility pattern for handling events. Objects that participate in the chain are called responder objects, inheriting from the NSResponder (OS X)/UIResponder (iOS) class. All view objects (NSView/UIView), view controller objects (NSViewController/UIViewController), window objects (NSWindow/UIWindow), and the application object (NSApplication/UIApplication) are responder objects.

Typically, when a view receives an event which it can't handle, it dispatches it to its superview until it reaches the view controller or window object. If the window can't handle the event, the event is dispatched to the application object, which is the last object in the chain. For example:

  • On OS X, moving a textured window with the mouse can be done from any location (not just the title bar), unless on that location there's a view which handles dragging events, like slider controls. If no such view (or superview) is there, dragging events are sent up the chain to the window which does handle the dragging event.
  • On iOS, it's typical to handle view events in the view controller which manages the view hierarchy, instead of subclassing the view itself. Since a view controller lies in the chain after all superviews, it can intercept any view events and handle them.

See also [edit]

External links [edit]

Twitter
News
Documents
Don't believe everything they write, until confirmed from AVATAR SEARCH site.







What is AVATAR SEARCH?

It's a social web research tool
that helps anyone exploring anything.
Learn more about us here.



Updates:


Stay up-to-date. Socialize with us!
We strive to bring you the latest
from the entire web.


Company Information: