二十三种设计模式全面解析-适配器模式:代码的奇迹之桥,连接你的世界!

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 二十三种设计模式全面解析-适配器模式:代码的奇迹之桥,连接你的世界!

软件开发的舞台上,我们经常面临着兼容性难题,就像是两个不同语言的人无法有效沟通一样。这种不兼容性可能是因为外部库的变化、不同团队的代码设计差异或者历史遗留问题。但是,我们无需绝望!今天,我将带你进入一个神奇的世界——适配器模式(Adapter Pattern),它是连接代码世界的奇迹之桥,能够让不兼容的组件和系统和谐共舞!


1、什么是适配器模式?

适配器模式是一种结构型设计模式,它能够让不兼容的接口和类能够协同工作,无需修改它们的源代码。适配器模式通过引入一个适配器来实现这一目标,该适配器将不兼容的接口转换为客户端期望的接口。适配器模式常用于整合已有代码和第三方组件、将不同版本的API进行适配,以及处理外部系统接口的变化。


2、适配器模式关键技术点

(1)、在适配器模式中,有三个主要角色

  • 目标接口(Target Interface):客户端期望的接口,适配器将目标接口转换为适配者接口。
  • 适配者类(Adaptee Class):需要被适配的类,它定义了客户端无法直接使用的接口。
  • 适配器类(Adapter Class):将适配者接口转换为目标接口的类,它实现了目标接口,并持有一个适配者对象。

适配器模式的核心思想是通过适配器类来将不兼容的接口进行转换。适配器类将客户端的请求转发给适配者类,并将适配者类的响应转换为客户端期望的形式。


(2)、适配器模式的关键技术点

目标接口的定义:目标接口是客户端所期望的接口,它定义了客户端使用的方法和行为。适配器类需要实现目标接口,以便与客户端进行适配。

适配者类的定义:适配者类是需要被适配的类,它定义了一组不兼容的接口。适配器类通过与适配者类进行组合或继承来使用适配者的功能。

适配器类的实现:适配器类需要实现目标接口,并持有一个适配者对象。在适配器类的方法中,将客户端的请求转发给适配者对象,并将适配者对象的响应进行适当的转换,以符合目标接口的要求。

适配器的种类:适配器可以分为类适配器和对象适配器两种形式。类适配器使用继承来实现适配器类,同时继承适配者类;对象适配器使用组合来实现适配器类,持有适配者对象作为成员变量。

A、类适配器示例

// 目标接口
interface TargetInterface {
    void request();
}
// 适配者类
class Adaptee {
    void specificRequest() {
        System.out.println("适配者的特殊请求");
    }
}
// 适配器类(类适配器)
class Adapter extends Adaptee implements TargetInterface {
    @Override
    public void request() {
        specificRequest();
    }
}
// 客户端代码
public class Client {
    public static void main(String[] args) {
        TargetInterface target = new Adapter();
        target.request();
    }
}

B、对象适配器示例

// 目标接口
interface TargetInterface {
    void request();
}
// 适配者类
class Adaptee {
    void specificRequest() {
        System.out.println("适配者的特殊请求");
    }
}
// 适配器类(对象适配器)
class Adapter implements TargetInterface {
    private Adaptee adaptee;
    Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override
    public void request() {
        adaptee.specificRequest();
    }
}
// 客户端代码
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        TargetInterface target = new Adapter(adaptee);
        target.request();
    }
}

双向适配器:有时候,适配器模式需要在适配器类中同时实现目标接口和适配者接口,以实现双向适配。这样可以让适配器既能将目标接口转换为适配者接口,也能将适配者接口转换为目标接口。

双向适配器示例:

// 目标接口
interface TargetInterface {
    void targetRequest();
}
// 适配者接口
interface AdapteeInterface {
    void adapteeRequest();
}
// 适配者类
class Adaptee implements AdapteeInterface {
    @Override
    public void adapteeRequest() {
        System.out.println("适配者的请求");
    }
}
// 适配器类(双向适配器)
class Adapter implements TargetInterface, AdapteeInterface {
    private Adaptee adaptee;
    Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override
    public void targetRequest() {
        adaptee.adapteeRequest();
    }
    @Override
    public void adapteeRequest() {
        System.out.println("适配器的请求");
    }
}
// 客户端代码
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Adapter adapter = new Adapter(adaptee);
        // 使用适配器调用目标接口
        adapter.targetRequest();
        // 使用适配器调用适配者接口
        adapter.adapteeRequest();
    }
}


让我们通过一个实际应用案例来深入理解适配器模式。

假设你正在开发一个电子商务平台,需要与多个支付系统进行集成,如PayPal、支付宝支付。

每个支付系统都有自己独特的接口和数据格式,导致你的代码无法直接与它们进行交互。这时候,适配器模式就是你的超级英雄!


下面是一个简化的示例代码,展示了适配器模式的实现:

// 目标接口
interface PaymentGateway {
    void pay(double amount);
}
// PayPal支付类
class PayPal implements PaymentGateway {
    public void pay(double amount) {
        System.out.println("Paying $" + amount + " via PayPal.");
        // 实际的支付逻辑
    }
}
// 支付宝支付类
class Alipay {
    public void makePayment(double amount) {
        System.out.println("Making payment of $" + amount + " via Alipay.");
        // 实际的支付逻辑
    }
}
// 支付宝适配器类
class AlipayAdapter implements PaymentGateway {
    private Alipay alipay;
    public AlipayAdapter(Alipay alipay) {
        this.alipay = alipay;
    }
    public void pay(double amount) {
        alipay.makePayment(amount);
    }
}
// 客户端代码
public class Main {
    public static void main(String[] args) {
        PaymentGateway paypal = new PayPal();
        paypal.pay(100.0);  // 使用PayPal支付
        PaymentGateway alipay = new AlipayAdapter(new Alipay());
        alipay.pay(200.0);  // 使用适配器将支付宝接口转换为PaymentGateway接口支付
    }
}


适配器模式是一种强大而灵活的设计模式,它可以帮助你解决不同接口和数据格式之间的不兼容性问题。

通过适配器模式,你可以将不同的代码世界连接在一起,创造出无限的可能性。

本文仅介绍了适配器模式的冰山一角,实际上它在软件开发中有着广泛的应用。无论是整合已有代码和第三方组件,还是处理外部系统接口的变化,适配器模式都能派上用场。



相关文章
|
12天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
12天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
12天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
12天前
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
87 2
|
3月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
87 0
|
3月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
68 0
|
3月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
73 0
|
3月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
96 0

推荐镜像

更多