设计模式之适配器模式

1、什么是适配器模式

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作

有两种适配器: 类的适配器和对象的适配器

2、适配器模式之类适配器模式

**实现方式:**让Adapter继承Adaptee类,然后实现Target接口,来实现适配器功能

  • Adaptee:适配者类,它是需要被访问的、需要被适配的组件.

  • Target:目标接口,当前系统业务所使用的接口,可以是抽象类或接口.

  • Adapter:适配器类,通过继承和实现目标接口,让客户端按照目标接口的方法访问适配者

  • Client:客户端,适配器的使用者

java 复制代码
/**
 * 源角色(Adaptee):现在需要适配的接口
 */
public class ZhiFu {
    public  void zhiFu(){
        System.out.println("跳转第三方平台");
    }
}
java 复制代码
/**
 * 目标角色(Target):这就是所期待得到的接口。
 * 注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
 */
public interface ZhiFuBao {
    void zhiFuBao();
}
java 复制代码
/**
 * 类适配器
 * 适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
 */
public class ZhiFuBaoAdapter extends ZhiFu implements ZhiFuBao{
    @Override
    public void zhiFuBao() {
        zhiFu();
        System.out.println("正在使用支付宝支付");
    }
}
java 复制代码
//测试类适配器
public class test {
    public static void main(String[] args) {
        ZhiFuBao zhiFuBao = new ZhiFuBaoAdapter();
        zhiFuBao.zhiFuBao();
}

优点:由于Adapter继承了Adaptee类,所以它可以根据需求重写Adaptee类的方法,使得Adapter的灵活性增强了。

缺点:因为java单继承的缘故,Target类==必须是接口==,以便于Adapter去继承Adaptee并实现Target,完成适配的功能,但这样就导致了Adapter里暴露了Adaptee类的方法,使用起来的成本就增加了。

3、适配器模式之对象适配器模式

**实现方式:**让Adapter持有Adaptee类的实例,然后再实现Target接口,以这种持有对象的方式来实现适配器功能。

java 复制代码
/**
 * 对象适配器
 */
public class ZhiFuBaoObjectAdapter implements ZhiFuBao{
    private ZhiFu zhiFu;

    public ZhiFuBaoObjectAdapter(ZhiFu zhiFu) {
        this.zhiFu = zhiFu;
    }

    @Override
    public void zhiFuBao() {
        zhiFu.zhiFu();
        System.out.println("正在使用支付");
    }
}
java 复制代码
//测试对象适配器
public class test {
    public static void main(String[] args) {
        ZhiFuBaoObjectAdapter zhiFuBaoObjectAdapter = new ZhiFuBaoObjectAdapter(new ZhiFu());
        zhiFuBaoObjectAdapter.zhiFuBao();
    }
}

优点:根据合成复用原则,使用组合替代继承, 所以它解决了类适配器必须继承Adaptee的

局限性问题,也不再要求Target必须是接口。使用成本更低,更灵活。

4、在那些地方见到过适配器模式

1、在JavaWeb导入的jsp-api.jar中GenericServlet类实现Servlet接口,GenericServlet就是一个适配器,HttpServlet类继承它 并重写service方法,然后自己定义的servlet继承HttpServlet并重写service方法

2、在 Spring MVC 中,HandlerAdapter 负责将请求分发给相应的处理器(Handler)。不同类型的处理器可能具有不同的接口,而 HandlerAdapter 则负责将不同类型的处理器适配为统一的处理器接口,从而实现请求的统一处理。

3、Spring AOP 框架中,AdvisorAdapter将不同类型的 Advisor 适配成统一的 MethodInterceptor(Advice)的工具。在 Spring AOP 中,Advisor 是将通知应用到切点上的对象,而 MethodInterceptor 是实际执行通知逻辑的对象。Spring AOP 将不同类型的通知(Before、After、Around、Throws 等)转换为相应的 Advisor,并将其适配到切点上。在运行时,每个 Advisor 都被转换为一个 MethodInterceptor,并应用于目标方法的执行。

相关推荐
七月丶1 天前
别再手动凑 PR 了:这个 AI Skill 会按仓库习惯自动建分支、拆提交、提 PR
人工智能·设计模式·程序员
刀法如飞1 天前
从程序员到架构师:6大编程范式全解析与实践对比
设计模式·系统架构·编程范式
九狼1 天前
Flutter + Riverpod +MVI 架构下的现代状态管理
设计模式
静水流深_沧海一粟2 天前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder2 天前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
阿星AI工作室2 天前
给openclaw龙虾造了间像素办公室!实时看它写代码、摸鱼、修bug、写日报,太可爱了吧!
前端·人工智能·设计模式
_哆啦A梦3 天前
Vibe Coding 全栈专业名词清单|设计模式·基础篇(创建型+结构型核心名词)
前端·设计模式·vibecoding
阿闽ooo6 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4966 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃6 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式