适配器模式-日志模块

Mybatis技术内幕-设计模式与应用场景总结

1、适配器模式

主要解决由于接口不能兼容而导致类无法使用的问题,适配器模式会将需要适配的类转换成调用者能够使用的目标接口。主要涉及以下几个角色:
目标接口Target:调用者能够直接使用的接口;
需要适配的类Adaptee:Adaptee中有真正的业务逻辑,但是不能被调用者直接使用;
适配器:Adapter实现了Target接口,并包装一个Adaptee对象,Adapter在实现Target接口中的方法时,会将调用委托给Adaptee对象的相关对象,由Adaptee中的方法完成具体的业务。
适配器模式UML
说明代码:

/**
 * 被适配者
 */
public class Adaptee {
  public void adapteeMethod(String str) {
    System.out.println(str);
  }
}

/**
 * 调用者能够直接使用的接口
 */
public interface Target {
  void printListContent(List<String> content);
}

/**
 * 由于Adaptee仅仅处理String,现在扩展为处理List<String>,调用方可以直接调用
 */
public class Adapter implements Target {
  Adaptee adaptee;
  @Override
  public void printListContent(List<String> content) {
    content.stream().forEach(str -> adaptee.adapteeMethod(str));
  }
}

对应类图
在这里插入图片描述

ATT:1、增加适配器之后,原有的调用是不会改变的,即项目之前对Adaptee的调用,是不需要修改的,这符合开放-闭合原则;

Mybatis场景
Mybatis内部调用其日志模块时,使用了其内部接口(org.apache.ibatis.logging.Log),但是Log4j、Log4j2等第三方日志组件对外提供的接口各不相同,Mybatis为了集成和复用这些第三方日志组件(这里可以理解成,集成第三方组件,提供该功能,但是其实是为了对Log进行复用),在其日志模块中提供了多种Adapter,将这些第三方日志组件对外的接口适配成了org.apache.ibatis.logging.Log接口,这样Mybatis内部就可以统一通过org.apache.ibatis.logging.Log接口调用第三方日志组件的功能了。
在这里插入图片描述

mybatis适配器源码,这里的Log既是Target类也是Adaptee类,Log是外部调用的接口,Jdk14LoggingImpl等复用了Log

package org.apache.ibatis.logging;

/**
 * @author Clinton Begin
 */
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);

}


package org.apache.ibatis.logging.jdk14;

import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.ibatis.logging.Log;

/**
 * @author Clinton Begin
 */
public class Jdk14LoggingImpl implements Log {

  private final 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);
  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值