设计模式之适配器模式

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,并应用于目标方法的执行。

相关推荐
踩着两条虫43 分钟前
VTJ 平台六大设计模式落地实战指南
开发语言·前端·人工智能·低代码·设计模式·重构·架构
石油人单挑所有3 小时前
基于多设计模式下的同步&异步日志系统测试报告
服务器·c++·vscode·设计模式
geovindu6 小时前
go:Decorator Pattern
开发语言·设计模式·golang·装饰器模式
ximu_polaris6 小时前
设计模式(C++)-行为型模式-观察者模式
c++·观察者模式·设计模式
Lands1 天前
推荐一下配合agent开发的工具
设计模式·agent
不才小强1 天前
行为型设计模式
设计模式
ximu_polaris1 天前
设计模式(C++)-结构型模式-享元模式
c++·设计模式·享元模式
geovindu1 天前
go: Facade Pattern
设计模式·golang·外观模式
旷世奇才李先生1 天前
React 18\+TypeScript实战: hooks封装与组件设计模式
react.js·设计模式·typescript
白夜11171 天前
C++设计模式(高内聚,低耦合)
c++·设计模式