设计模式之JAVA

Adapter

2020-09-15  本文已影响0人  93张先生

适配器模式

An adapter convert the interface of a class into another interface clients expect. It lets classes work together that couldn’t otherwise because of incompatible interfaces.

适配器将一个接口,转化为自己期望的接口;使不兼容的接口可以同时工作。

组件

UML

image.png
image.png

场景

mybatis 日志采用适配器模式,适配了 slf4j、log4j 等多个日志框架;

Log

目标接口,供客户端调用使用。

public interface Log {

  boolean isDebugEnabled();

  boolean isTraceEnabled();

  void error(String s, Throwable e);

  void error(String s);

  void debug(String s);

  void trace(String s);

  void warn(String s);

}

Logger

需要适配的类( Adaptee ),java.util.logging.Logger 日志

public class Logger {
    public void log(Level level, String msg) {
        if (!isLoggable(level)) {
            return;
        }
        LogRecord lr = new LogRecord(level, msg);
        doLog(lr);
    }
}

Jdk14LoggingImpl

适配器 Adapter 适配了 java.util.logging 接口

public class Jdk14LoggingImpl implements Log {

  // 底层封装的 java.util.logging.Logger 对象
  private final Logger log;

  // 通过 logConstructor.newInstance(logger) 初始化 java.util.logging.Logger 对象; logger 为调用 log 日志的类名称
  public Jdk14LoggingImpl(String clazz) {
    log = Logger.getLogger(clazz);
  }

  @Override
  public boolean isDebugEnabled() {
    return log.isLoggable(Level.FINE);
  }

  @Override
  public boolean isTraceEnabled() {
    return log.isLoggable(Level.FINER);
  }

  @Override
  public void error(String s, Throwable e) {
    log.log(Level.SEVERE, s, e);
  }

  @Override
  public void error(String s) {
    log.log(Level.SEVERE, s);
  }

  @Override
  public void debug(String s) {
    log.log(Level.FINE, s);
  }

  @Override
  public void trace(String s) {
    log.log(Level.FINER, s);
  }

  @Override
  public void warn(String s) {
    log.log(Level.WARNING, s);
  }

}

Client

外部调用使用 Log 对象

public Class Client{
  public static void main(String[] args) {
   //  需要适配的类
    Log adaptee = new org.apache.ibatis.logging.jdk14.Jdk14LoggingImpl();
   // 适配器
    Log log = new Jdk14LoggingImpl(adaptee.class.getName());
    log.info("--------finsh-----------");
  }
}
上一篇下一篇

猜你喜欢

热点阅读