デザインモードの装飾モード(七)

2022 ワード

一、概念
既存のクラスを修飾して機能を拡張します.
二、実例説明
1、プロジェクトではlog 4 jを使用してログを印刷します.一般的には:
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
logger.error(msg);

これをjson形式に変換する必要があり、装飾モードを採用することができます.2、コード実現
public class DecoratorLogger implements Logger {

   public Logger logger;

   public DecoratorLogger(Logger logger) {

       this.logger = logger;
   }
    
   @Override
   public void error(String str) {}

   @Override
   public void info(String str) {}
       
   //        
}
public class JsonLogger extends DecoratorLogger {
public JsonLogger(Logger logger) {
        
        super(logger);
    }
        
    @Override
    public void info(String msg) {

        JSONObject result = composeBasicJsonResult();
        result.put("MESSAGE", msg);
        logger.info(result.toString());
    }
    
    @Override
    public void error(String msg) {
        
        JSONObject result = composeBasicJsonResult();
        result.put("MESSAGE", msg);
        logger.error(result.toString());
    }
    
    public void error(Exception e) {

        JSONObject result = composeBasicJsonResult();
        result.put("EXCEPTION", e.getClass().getName());
        String exceptionStackTrace = ExceptionUtils.getStackTrace(e);    
        result.put("STACKTRACE", exceptionStackTrace);
        logger.error(result.toString());
    }
    
    public static class JsonLoggerFactory {
        
        @SuppressWarnings("rawtypes")
        public static JsonLogger getLogger(Class clazz) {

            Logger logger = LoggerFactory.getLogger(clazz);
            return new JsonLogger(logger);
        }
    }
    
    private JSONObject composeBasicJsonResult() {
        //          
    }
}
private static final Logger logger = JsonLoggerFactory.getLogger(Component.class);
    logger.error(string);

三、まとめ
装飾モードの核心は装飾にあり、被装飾自体の核心機能に影響を与えない.