Chain of Responsibility Pattern
-behavioral pattern
-request를 처리하는 객체들을 만든다.
-request type에 기반하여 sender와 receiver을 decouple한다.
-receiver는 또다른 receiver에 대한 reference를 가지며, 만일 해당객체가 request를 처리하지 못하면 다음 receiver에 전달하는 구조이다.
log message의 레벨은 해당 Logger가 가지는 level보다 작거나 같아야만 메시지를 출력 가능하다.
결과에서 보이듯 ERROR 레벨에서는 DEBUG 및 INFO 메시지를 출력할 수 없다.
Logger에 대한 set은 getChainOfLoggers에서 진행한다.
AbstractLogger.java
public abstract class AbstractLogger { public static int INFO = 1; public static int DEBUG = 2; public static int ERROR = 3; public final static String TAG = "logger"; protected int level; protected AbstractLogger nextLogger; public void setNextLogger(AbstractLogger nextLogger){ this.nextLogger=nextLogger; } public void logMessage(int level, String msg){ if( this.level <= level){ write(msg); } if (nextLogger != null) { nextLogger.logMessage(level,msg); } } abstract protected void write (String msg); }
ChainPatternDemo.java
public class ChainPatternDemo { public static AbstractLogger getChainOfLoggers(){ AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR); AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG); AbstractLogger consolLogger = new ConsoleLogger(AbstractLogger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consolLogger); return errorLogger; } public static void main(){ AbstractLogger loggerChain = getChainOfLoggers(); loggerChain.logMessage(AbstractLogger.INFO,"this is info"); loggerChain.logMessage(AbstractLogger.DEBUG,"this is debug"); loggerChain.logMessage(AbstractLogger.ERROR,"this is error"); } }
나머지
public class ConsoleLogger extends AbstractLogger { public ConsoleLogger(int level){ this.level=level; } @Override protected void write(String msg) { Log.d(TAG, "console :" + msg); } } public class ErrorLogger extends AbstractLogger { public ErrorLogger(int level){ this.level=level; } @Override protected void write(String msg) { Log.d(TAG, "error :" + msg); } } public class FileLogger extends AbstractLogger { public FileLogger(int level){ this.level=level; } @Override protected void write(String msg) { Log.d(TAG, "file :" + msg); } }
결과:
07-20 15:27:17.084 14846 14846 D logger : console :this is info
07-20 15:27:17.084 14846 14846 D logger : file :this is debug
07-20 15:27:17.084 14846 14846 D logger : console :this is debug
07-20 15:27:17.084 14846 14846 D logger : error :this is error
07-20 15:27:17.085 14846 14846 D logger : file :this is error
07-20 15:27:17.085 14846 14846 D logger : console :this is error
출처 :
https://www.tutorialspoint.com/design_pattern/chain_of_responsibility_pattern.html
'pattern' 카테고리의 다른 글
Interpreter pattern (0) | 2018.07.20 |
---|---|
Command pattern (0) | 2018.07.20 |
Proxy Pattern (0) | 2018.07.20 |
Flyweight pattern (0) | 2018.07.20 |
Facade Pattern (0) | 2018.07.20 |