从开源框架理解设计模式系列#Adapter适配器模式

适配器模式通过转换接口使不兼容的类协同工作,常见于框架设计中,如Dubbo的LoggerAdapter和SpringMVC的HandlerAdapter。领域驱动设计的防腐层也是此模式的应用。适配器模式提供灵活性和扩展性,但类适配器在某些语言中存在局限,对象适配器置换方法较复杂。
摘要由CSDN通过智能技术生成

目录

what什么是适配器模式

why为什么需要适配器模式       

how怎么实现适配器模式       

类适配器模式

对象适配器模式

类适配器和对象适配器对比

 开源框架经典案例

Dubbo之LoggerAdapter

经典的SpringMVC之HandlerAdapter

Spring中的MethodInterceptor适配器

领域驱动设计之防腐层(Anti-corruption layer)

常用场景

优缺点对比

优点

类适配器优点

对象适配器模式优点

缺点

类适配器模式的缺点

对象适配器模式的缺点

总结        

参考资料


what什么是适配器模式


GOF定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(Gof里面说这个别名是Wrapper模式,这里和装饰器模式容易混淆,因为装饰器也可以说是Wrapper)

HeadFirst定义:将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
 

why为什么需要适配器模式
       

         这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。者可以让客户从实现的接口解耦。如果在一段时间之后,我们想改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。

        这个模式是让客户和接口绑定起来,而不说和实现绑定起来。我们可以多个适配器,每一个都负责转换不同组的后台类。

        适配器模式的思想也延伸到方方面面,我们买苹果产品,欧洲和中国的插座不一样,就需要买一个转换头,这是典型的适配器场景,也是很多介绍适配器文章的经典例子。在往设计领域思考,领域驱动设计里面提到的防腐层,其实也是适配器的思想。

        

how怎么实现适配器模式
       


适配器模式(Adapter)包含以下主要角色。

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。


类适配器模式
 

类适配器模式的结构图


 


对象适配器模式
 

对象适配器模式的结构图


 

类适配器和对象适配器对比

这里引用HeadFirst里面的原话

 
开源框架经典案例

Dubbo之LoggerAdapter

        日志框架何其多,每个公司甚至每个项目组估计都有一个自己的logger,为了适配不同的日志框架,dubbo中定义了自己的Logger接口,接口代码如下。同时新增了LoggerAdapter是适配不同的日志框架,该LoggerAdapter也标注了SPI注解,因此在引入dubbo後可根据项目按需配置,这是标准的不能再标准的适配器模式。

定义自己的Logger接口
package org.apache.dubbo.common.logger;

/**
 * Logger interface
 * <p>
 * This interface is referred from commons-logging
 */
public interface Logger {

    /**
     * Logs a message with trace log level.
     *
     * @param msg log this message
     */
    void trace(String msg);

    /**
     * Logs an error with trace log level.
     *
     * @param e log this cause
     */
    void trace(Throwable e);

    /**
     * Logs an error with trace log level.
     *
     * @param msg log this message
     * @param e   log this cause
     */
    void trace(String msg, Throwable e);

   .... 省略其他的方法

}
日志适配器接口,具体的适配逻辑由子类实现
@SPI 
public interface LoggerAdapter {

    /**
     * Get a logger
     *
     * @param key the returned logger will be named after clazz
     * @return logger
     */
    Logger getLogger(Class<?> key);

    /**
     * Get a logger
     *
     * @param key the returned logger will be named afte
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值