Chain of Responsibility 책임 전가 패턴

 - 요청이 발생했을때, 첫번째 객체가 요청을 처리하지 못할 경우 다음 객체에게 요청을 전달한다.

 - 요청이 처리될 때까지 고리를 따라 요청을 전달하는 패턴.


  1. abstract class Logger {
  2.         public static int ERR = 3;
  3.         public static int NOTICE = 5;
  4.         public static int DEBUG = 7;
  5.  
  6.         protected int mask;
  7.         protected Logger next;
  8.  
  9.         public void setNext(Logger log) {
  10.                 next = log;
  11.         }
  12.  
  13.         public void message(String msg, int priority) {
  14.                 // 권한이 있으면 처리하고 메시지를 다음(next) 로거에게 넘긴다.
  15.                 if (priority <= mask) {
  16.                         writeMessage(msg);
  17.                 }
  18.                 if (next != null) {
  19.                         next.message(msg, priority);
  20.                 }
  21.         }
  22.  
  23.         abstract protected void writeMessage(String msg);
  24.  
  25.         // private static final Logger INSTANCE = new Logger();
  26.         public static Logger createChain() {
  27.                 Logger logger = new StdoutLogger(Logger.DEBUG);
  28.                 // 처리하지 못하면 다음으로 책임을 넘긴다.
  29.                 Logger logger1 = new EmailLogger(Logger.NOTICE);
  30.                 logger.setNext(logger1);
  31.                 Logger logger2 = new StderrLogger(Logger.ERR);
  32.                 logger1.setNext(logger2);
  33.                 return logger;
  34.         }
  35.  
  36. }
  37.  
  38. class StdoutLogger extends Logger {
  39.         public StdoutLogger(int mask) {
  40.                 this.mask = mask;
  41.         }
  42.  
  43.         @Override
  44.         protected void writeMessage(String msg) {
  45.                 System.out.println("Writing to stdout : " + msg);
  46.         }
  47. }
  48.  
  49. class EmailLogger extends Logger {
  50.         public EmailLogger(int mask) {
  51.                 this.mask = mask;
  52.         }
  53.  
  54.         @Override
  55.         protected void writeMessage(String msg) {
  56.                 System.out.println("Sending to via email : " + msg);
  57.         }
  58.  
  59. }
  60.  
  61. class StderrLogger extends Logger {
  62.         public StderrLogger(int mask) {
  63.                 this.mask = mask;
  64.         }
  65.  
  66.         @Override
  67.         protected void writeMessage(String msg) {
  68.                 System.out.println("Writing to err : " + msg);
  69.  
  70.         }
  71. }
  72.  
  73. public class Ex1 {
  74.  
  75.         public static void main(String[] args) {
  76.                 Logger logger = Logger.createChain();
  77.                 logger.message("Entering function y.", Logger.DEBUG);
  78.                 logger.message("Step 1 completed. ", Logger.NOTICE);
  79.                 logger.message("An error has occured.", Logger.ERR);
  80.         }
  81.  
  82. }


'java > design_pattern' 카테고리의 다른 글

Iterator Pattern - 열거자  (0) 2014.07.01
Visitor Pattern - 방문자 패턴  (0) 2014.07.01
MediatorPattern - 중재자 패턴  (0) 2014.07.01
ObserverPattern - 관찰자 패턴  (0) 2014.07.01
Factory method pattern  (0) 2014.06.27

+ Recent posts