重学 Java 设计模式:实战适配器模式

简介: 重学 Java 设计模式:实战适配器模式

重学 Java 设计模式:实战适配器模式

前言

在实际开发中,我们经常会遇到需要从多个 MQ 消息体中抽取指定字段值的场景。例如,从一个包含多个字段的 JSON 消息体中,只需要抽取其中一个字段的值来进行后续处理。这时,我们可以使用适配器模式来实现快速、有效的数据转换。

本文将从实际场景出发,介绍适配器模式的概念、特点、优缺点以及在 Java 中的具体实现。并且通过实战案例展示如何使用适配器模式从多个 MQ 消息体中抽取指定字段值。

什么是适配器模式

适配器模式是一种结构型设计模式,其作用是将一个类的接口转换成客户端所期望的另一种接口,以达到解耦的目的。适配器模式通常用于对已有类的适配,或是多个类的接口不兼容的情况下,通过适配器来完成相互之间的配合。

适配器模式通常包括三个角色:

  1. 目标接口(Target interface):客户端所期望的接口,即客户端想要调用的接口。
  2. 适配器(Adapter):负责将源接口转换为目标接口。适配器通常包括一个目标接口的引用,以及一个源接口的实例对象。
  3. 源接口(Adaptee):已有的类或对象,其接口与目标接口不兼容,需要被适配器转换为目标接口。

适配器模式的特点

适配器模式的最大特点是解耦,它能够将客户端与源接口解耦,从而实现源接口的透明性,使得客户端无需了解源接口的具体实现细节。

另外,适配器模式还具有以下几个特点:

  • 灵活性:适配器可以动态地新增、替换已有的源接口,从而实现灵活性和可扩展性。
  • 重用性:适配器可以重复利用已有的代码,降低了代码的重复率。
  • 安全性:适配器可以将客户端和源接口隔离,从而提高代码的安全性。

适配器模式的优缺点

适配器模式的优点在于它能够实现不同接口之间的适配,从而扩展了已有的接口和类的应用范围。同时,适配器模式还能够提高代码的重用率和灵活性,降低了代码的耦合度。

适配器模式的缺点在于它可能会增加代码的复杂度,特别是当目标接口的方法较多,需要添加适配器方法时,会增加代码的维护难度。此外,过多的适配器还可能影响程序的性能。

适配器模式在 Java 中的具体实现

在 Java 中,适配器模式的实现方式主要有两种,即类适配器模式和对象适配器模式。

类适配器模式

类适配器模式使用继承来实现,即适配器继承自源接口,并实现目标接口。这样,适配器就可以同时拥有源接口和目标接口的功能,从而将源接口转换为目标接口。

以下是类适配器模式的示意图:

Java 中的类适配器模式实现代码如下:

public interface Target {
    void request();
}
public class Adaptee {
    public void SpecificRequest() {
        // 原有的业务逻辑
    }
}
public class Adapter extends Adaptee implements Target {
    // 实现目标接口
    @Override
    public void request() {
        // 转换源接口并调用方法
        this.SpecificRequest();
    }
}

对象适配器模式

对象适配器模式使用组合来实现,即适配器持有一个源接口的实例对象,并实现目标接口。这样,适配器就可以通过持有源接口的实例对象,将源接口转换为目标接口。

Java 中的对象适配器模式实现代码如下:

public interface Target {
    void request();
}
public class Adaptee {
    public void SpecificRequest() {
        // 原有的业务逻辑
    }
}
public class Adapter implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    // 实现目标接口
    @Override
    public void request() {
        // 转换源接口并调用方法
        this.adaptee.SpecificRequest();
    }
}

实战案例:从多个 MQ 消息体中抽取指定字段值

在实际开发中,我们常常需要从多个 MQ 消息体中抽取指定字段值,例如从 JSON 消息体中抽取某个字段的值。这时,我们可以使用适配器模式来处理该场景。

以下是一个从多个 JSON 消息体中抽取指定字段值的实战案例:

public interface Extractor {
    String extract(JSONObject json);
}
public class UserIdExtractor implements Extractor {
    @Override
    public String extract(JSONObject json) {
        return json.getString("userId");
    }
}
public class UserNameExtractor implements Extractor {
    @Override
    public String extract(JSONObject json) {
        return json.getString("userName");
    }
}
public class FieldExtractorAdapter implements Extractor {
    private Extractor extractor;
    public FieldExtractorAdapter(Extractor extractor) {
        this.extractor = extractor;
    }
    @Override
    public String extract(JSONObject json) {
        return this.extractor.extract(json.getJSONObject("data"));
    }
}

在上述代码中,Extractor 是抽象接口,定义了从 JSON 消息体中抽取字段的方法,UserIdExtractorUserNameExtractor 是具体实现类,分别用于从 JSON 消息体中抽取 userIduserNameFieldExtractorAdapter 则是适配器类,实现了 Extractor 接口,并持有一个具体实现类的实例,通过调用具体实现类的方法,将源接口适配为目标接口。

接下来,我们可以通过如下的代码调用 FieldExtractorAdapter

public static void main(String[] args) {
    String jsonString = "{\"data\": {\"userId\": \"123\", \"userName\": \"Tom\"}}";
    JSONObject json = JSONObject.parseObject(jsonString);
    Extractor userIdExtractor = new FieldExtractorAdapter(new UserIdExtractor());
    Extractor userNameExtractor = new FieldExtractorAdapter(new UserNameExtractor());
    String userId = userIdExtractor.extract(json);
    String userName = userNameExtractor.extract(json);
    System.out.println("userId: " + userId + ", userName: " + userName);
}

输出结果如下:

userId: 123, userName: Tom

总结

适配器模式是一种结构型设计模式,其应用场景非常广泛。适配器模式能够实现不同接口之间的适配,从而扩展了已有的接口和类的应用范围。同时,适配器模式还能够提高代码的重用率和灵活性,降低了代码的耦合度。

在 Java 中,适配器模式的实现方式主要有两种,即类适配器模式和对象适配器模式。具体实现可根据实际需求灵活选择。

最后,我们通过一个实战案例介绍了如何使用适配器模式从多个 MQ 消息体中抽取指定字段值。适配器模式在实际开发中有着广泛的应用,帮助我们快速、高效地实现不同接口之间的适配。


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1天前
|
设计模式 存储 Java
【十】设计模式~~~结构型模式~~~享元模式(Java)
文章详细介绍了享元模式(Flyweight Pattern),这是一种对象结构型模式,通过共享技术实现大量细粒度对象的重用,区分内部状态和外部状态来减少内存中对象的数量,提高系统性能。通过围棋棋子的设计案例,展示了享元模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了单纯享元模式和复合享元模式以及与其他模式的联用。
【十】设计模式~~~结构型模式~~~享元模式(Java)
|
1天前
|
设计模式 存储 Java
【九】设计模式~~~结构型模式~~~外观模式(Java)
文章详细介绍了外观模式(Facade Pattern),这是一种对象结构型模式,通过引入一个外观类来简化客户端与多个子系统之间的交互,降低系统的耦合度,并提供一个统一的高层接口来使用子系统。通过文件加密模块的实例,展示了外观模式的动机、定义、结构、优点、缺点以及适用场景,并讨论了如何通过引入抽象外观类来提高系统的可扩展性。
【九】设计模式~~~结构型模式~~~外观模式(Java)
|
1天前
|
设计模式 算法 安全
Java编程中的设计模式:提升代码的可维护性和扩展性
【8月更文挑战第19天】在软件开发的世界里,设计模式是解决常见问题的一种优雅方式。本文将深入探讨Java编程语言中常用的几种设计模式,并解释如何通过这些模式来提高代码的可维护性和扩展性。文章不涉及具体的代码实现,而是侧重于理论和实践相结合的方式,为读者提供一种思考和改善现有项目的新视角。
|
1天前
|
设计模式 Java
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
文章提供了一份常用设计模式的全面介绍,包括创建型模式、结构型模式和行为型模式。每种设计模式都有详细的概念讲解、案例说明、代码实例以及运行截图。作者通过这些模式的介绍,旨在帮助读者更好地理解源码、编写更优雅的代码,并进行系统重构。同时,文章还提供了GitHub上的源码地址,方便读者直接访问和学习。
常用设计模式介绍~~~ Java实现 【概念+案例+代码】
|
1天前
|
设计模式 算法 Java
【十六】设计模式~~~行为型模式~~~策略模式(Java)
文章详细介绍了策略模式(Strategy Pattern),这是一种对象行为型模式,用于定义一系列算法,将每个算法封装起来,并使它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了系统的灵活性和可扩展性。通过电影院售票系统中不同类型用户的打折策略案例,展示了策略模式的动机、定义、结构、优点、缺点以及适用场景,并提供了Java代码实现和测试结果。
【十六】设计模式~~~行为型模式~~~策略模式(Java)
|
1天前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
1天前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
|
1天前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
1天前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
1天前
|
设计模式 存储 Java
【十二】设计模式~~~行为型模式~~~命令模式(Java)
文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。