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

本文介绍了适配器模式在实际开发中的应用,特别是在处理MQ消息体时如何抽取指定字段值。适配器模式通过将不兼容接口转换为客户期望接口,实现解耦。文章讨论了适配器模式的概念、特点、优缺点,并提供了Java中类适配器和对象适配器的实现示例。最后,通过一个实战案例展示了如何使用适配器模式处理JSON消息体。
摘要由CSDN通过智能技术生成

2023年06月08日 00:09 ·  阅读 117

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

前言

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

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

什么是适配器模式

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

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

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

适配器模式的特点

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

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

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

适配器模式的优缺点

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

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

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

在 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 中的对象适配器模式实现代码如下:

 

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 消息体中抽取指定字段值的实战案例:

 

java

复制代码

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 消息体中抽取字段的方法,UserIdExtractor 和 UserNameExtractor 是具体实现类,分别用于从 JSON 消息体中抽取 userId 和 userNameFieldExtractorAdapter 则是适配器类,实现了 Extractor 接口,并持有一个具体实现类的实例,通过调用具体实现类的方法,将源接口适配为目标接口。

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

 

java

复制代码

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); }

输出结果如下:

 

yaml

复制代码

userId: 123, userName: Tom

总结

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值