Skip to content

Instantly share code, notes, and snippets.

@solaris33
Last active May 20, 2017 11:59
Show Gist options
  • Save solaris33/a7b9b722585d045de9eabe31b93c00ab to your computer and use it in GitHub Desktop.
Save solaris33/a7b9b722585d045de9eabe31b93c00ab to your computer and use it in GitHub Desktop.
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 log) {
next = log;
return 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 {
public static void main(String[] args) {
// Build the chain of responsibility
Logger logger, tempLogger;
tempLogger = new StdoutLogger(Logger.DEBUG);
logger = tempLogger;
tempLogger = tempLogger.setNext(new EmailLogger(Logger.NOTICE));
tempLogger = tempLogger.setNext(new StderrLogger(Logger.ERR));
// Handled by StdoutLogger
logger.message("Entering function y.", Logger.DEBUG);
// Handled by StdoutLogger and EmailLogger
logger.message("Step1 completed.", Logger.NOTICE);
// Handled by all three loggers
logger.message("An error has occurred.", Logger.ERR);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment