设计模式之适配器模式

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

相关推荐
wu~9703 小时前
手撕四种常用设计模式(工厂,策略,代理,单例)
java·单例模式·设计模式·代理模式·抽象工厂模式·策略模式
敲代码的 蜡笔小新10 小时前
【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
unity·设计模式·c#·访问者模式
软考真题app1 天前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin03331 天前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin1 天前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan1 天前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免1 天前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死1 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式