设计模式学习笔记(八)适配器模式介绍及其应用

博客 动态
0 175
羽尘
羽尘 2022-03-29 23:57:18
悬赏:0 积分 收藏

设计模式学习笔记(八)适配器模式介绍及其应用

适配器模式(Adapter)指的是将一个类的接口转换成另一个可以兼容的接口。比如我们日常生活中的转换头、古早时期使用的电池万能充,就相当于程序中使用的适配器模式。

image-20220329210951114

一、适配器模式的介绍

1.1 适配器模式的结构

适配器模式模式主要分为类结构型模式和对象结构型模式两种:

1.1.1 类适配器模式

类适配器模式通过多重继承,将一个接口与另一个接口进行匹配。而对于一些面向对象语言如C#、Java不支持多重继承,那么我们就可以继承一个类,同时实现多个接口来达到适配器的效果。如下图所示:

image-20220329214512809

  • Adaptee:适配者类,它是需要被访问的、需要被适配的组件
  • Target:目标接口,当前系统业务所使用的接口,可以是抽象类或接口
  • Adapter:适配器类,通过继承和实现目标接口,让客户端按照目标接口的方法访问适配者
  • Client:客户端,适配器的使用者

1.1.2 对象适配器模式

对象适配器模式相对于类适配器的不同点在于,对象适配器中适配者类和适配器类的耦合度要更低。如下图所示:

image-20220329215848876

  • Adaptee:适配者类,它是需要被访问的、需要被适配的组件
  • Target:目标接口,当前系统业务所使用的接口,可以是抽象类或接口
  • Adapter:适配器类,通过聚合和实现目标接口,让客户端按照目标接口的方法访问适配者
  • Client:客户端,适配器的使用者

1.2 适配器模式的应用实现

我们可以根据上面两种模式分别进行实现:

1.2.1 类适配器实现代码

//适配者类public class Adaptee {    public void specificRequest(){        System.out.println("我是适配者类");    }}//目标接口public interface Target {    public void request();}//适配器类public class Adapter extends Adaptee implements Target{    @Override    public void request() {        specificRequest();    }}//客户端类public class Client {    public static void main(String[] args) {        Target target = new Adapter();        target.request();    }}

1.2.2 对象适配器实现代码

//适配者类public class Adaptee {    public void specificRequest(){        System.out.println("我是适配者类");    }}//对象适配器类public class ObjectAdapter implements Target{    private Adaptee adaptee;    public ObjectAdapter(Adaptee adaptee) {        this.adaptee = adaptee;    }    @Override    public void request() {        adaptee.specificRequest();    }}//客户端类public class Client {    public static void main(String[] args) {        Adaptee adaptee = new Adaptee();        Target target = new ObjectAdapter(adaptee);        target.request();    }}

我们发现,对象适配器模式是在适配器类中引入了适配者,这样就利用聚合的方式将两个类连接在一起。而根据设计原则,聚合优先于继承,所以在我们日常的使用中,应该多选择对象适配器模式。

三、适配器的应用场景

3.1 MyBatis中的日志适配应用

在MyBatis 中的典型代表是日志模块,比如其中适配了slf4jApache Commons LoggingLog4j2JDK logging等的日志类型,下面来看看具体实现:

//统一的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);}

MyBatis 定义了多个日志类型的适配器,以Log4j2实现为例:

public class Log4j2Impl implements Log {  private final Log log;  public Log4j2Impl(String clazz) {    Logger logger = LogManager.getLogger(clazz);    if (logger instanceof AbstractLogger) {      log = new Log4j2AbstractLoggerImpl((AbstractLogger) logger);    } else {      log = new Log4j2LoggerImpl(logger);    }  }  @Override  public boolean isDebugEnabled() {    return log.isDebugEnabled();  }  @Override  public boolean isTraceEnabled() {    return log.isTraceEnabled();  }  @Override  public void error(String s, Throwable e) {    log.error(s, e);  }  @Override  public void error(String s) {    log.error(s);  }  @Override  public void debug(String s) {    log.debug(s);  }  @Override  public void trace(String s) {    log.trace(s);  }  @Override  public void warn(String s) {    log.warn(s);  }}

所以在项目添加Log4j2后,就可以直接使用它打印MyBatis的日志信息。

3.2 营销系统中的各种MQ消息或接口的适配应用

posted @ 2022-03-29 23:27 归斯君 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    羽尘

    羽尘 (王者 段位)

    2335 积分 (2)粉丝 (11)源码

     

    温馨提示

    亦奇源码

    最新会员