适配器模式(Adapter Pattern)

23种设计模式系列目录

23种设计模式之单例模式(Singleton Pattern)

23种设计模式之代理模式(Proxy Pattern)

23种设计模式之适配器模式(Adapter Pattern)

23种设计模式之工厂模式(Factory Pattern)

23种设计模式之抽象工厂模式(Abstract Factory Pattern)

23种设计模式之装饰器模式(Decorator Pattern)

--------------------------------------------------------------------------------------------------------------------------

读完本篇文章将会了解以下问题

1. 适配器模式定义

2. 适配器模式代码实现

3. 适配器模式的优缺点分析

--------------------------------------------------------------------------------------------------------------------------

1. 适配器模式定义

       适配器模式(Adapter)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。举个例子,MyBatis日志模块定义了error、debug、trace、warn四个级别,但因为其需要对接其他的第三方日志组件对于日志级别的定义各不相同(比如Log4j定义的日志级别是fine、finer、finest、all),那么该如何将实现自不同接口的第三方日志级别转换为MyBatis内部定义好的日志级别呢?

2. 适配器模式代码实现

类图关系:

Log4jLog:Log4j日志级别接口

public interface Log4jLog {
    void fine();
    void finer();
    void finest();
    void all();
}

Log4jLogger:Log4j日志实现类

public class Log4jLogger implements Log4jLog{
    @Override
    public void fine() {
        System.out.println("Log4j:fine");
    }
    @Override
    public void finer() {
        System.out.println("Log4j:finer");
    }
    @Override
    public void finest() {
        System.out.println("Log4j:finest");
    }
    @Override
    public void all() {
        System.out.println("Log4j:all");
    }
}

MybatisLog:Mybatis日志级别接口

public interface MybatisLog {
    void error(String s);
    void debug(String s);
    void trace(String s);
    void warn(String s);
}

MybatisLogger:Mybatis日志实现类

public class MybatisLogger implements MybatisLog {
  private final Log4jLogger log;
  public MybatisLogger(Log4jLogger log) {
    this.log = log;
  }
  @Override
  public void error(String s) {
    log.fine();
  }
  @Override
  public void debug(String s) {
    log.finer();
  }
  @Override
  public void trace(String s) {
    log.finest();
  }
  @Override
  public void warn(String s) {
    log.all();
  }
}

run001:测试类

public class run001 {
    public static void main(String[] args) {
        MybatisLog mybatisLog = new MybatisLogger(new Log4jLogger());
        mybatisLog.debug("debug");
        mybatisLog.error("error");
        mybatisLog.trace("trace");
        mybatisLog.warn("warn");
    }
}

执行结果:

Log4j:finer
Log4j:fine
Log4j:finest
Log4j:all

       上述例子中的MybatisLogger类就可以看做是一个适配器类,Log4j和Mybatis各自拥有自己定义好的日志级别,而该适配器类的作用就是在Mybatis对接Log4j日志组件后,当调用Mybatis的debug级别的时候,实际是调用的Log4j的finer级别,借此实现适配器的功能。此demo是采用注入依赖的方式实现适配器模式,还可以考虑继承的方式实现。

3. 适配器模式的优缺点分析

适配器模式的优点:

      1、将目标类和适配者类解耦。

      2、提高了类的复用。

      3、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

      4、灵活性好,且符合开闭原则。

适配器模式的缺点:

      1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了B接口的实现。

      2、Java不支持多继承,故一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值