首页 > 编程语言 >程序员必知!适配器模式的实战应用与案例分析

程序员必知!适配器模式的实战应用与案例分析

时间:2023-12-29 11:03:46浏览次数:40  
标签:必知 适配器 OldClass 模式 程序员 接口 public 客户端

程序员必知!适配器模式的实战应用与案例分析 - 程序员古德

适配器模式是一种结构型设计模式,它允许不同接口的对象协同工作,它通过将一个类的接口转换成客户希望的另外一个接口,使得不兼容的类可以一起工作。适配器模式提高了类的复用性、系统的灵活性和可扩展性,并降低了系统间的耦合度,在实际应用中,例如电源适配器和数据转换器,以及编程中封装老旧接口或第三方库都体现了适配器模式的应用。

定义

程序员必知!适配器模式的实战应用与案例分析 - 程序员古德

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许对象具有不同的接口协同工作,这种类型的设计模式属于结构模式,因为此模式作用于对象的结构。

在适配器模式中,我们通过将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它的主要作用是解决两个已有接口间不兼容的问题,它允许我们在不修改现有代码的情况下,将两个不兼容的接口通过适配器进行对接,从而使得它们能够协同工作,它在实际应用中的例子有很多,比如电源适配器、数据转换器等。在编程中,适配器模式也经常用于封装老旧的接口或者第三方库,以便它们能够与新的代码或框架协同工作,适配器模式的主要优点有:

  1. 提高了类的复用性,通过适配器模式,我们可以将已有的类进行复用,而无需修改其结构。
  2. 提高了系统的灵活性和可扩展性,当需要引入一个新的接口时,只需增加一个新的适配器类,而无需修改原有代码。
  3. 降低了系统间的耦合度,通过适配器模式,我们可以将原本紧密耦合的两个系统解耦,从而提高系统的可维护性和稳定性。

代码案例

程序员必知!适配器模式的实战应用与案例分析 - 程序员古德

使用演示

下面演示了未使用适配器模式的代码和使用了适配器模式的代码,如下代码:

1、未使用适配器模式的反例,假设我们有一个已有的类 OldClass,这个类的方法不满足客户端的需求:

// 已有的类,不满足客户端需求  
public class OldClass {  
    public void specificRequest() {  
        System.out.println("OldClass specific request.");  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        OldClass oldClass = new OldClass();  
        // 客户端需要调用 request() 方法,但是 OldClass 没有此方法  
        // oldClass.request(); // 这行代码会导致编译错误  
        oldClass.specificRequest(); // 只能调用已有的方法  
    }  
}

在上述反例中,Client 希望调用一个名为 request() 的方法,但是 OldClass 只有 specificRequest() 方法,这导致 Client 无法直接使用 OldClass

2、使用适配器模式的正例,为了解决上述问题,我们可以使用适配器模式,将一个类的接口转换成客户端所期望的另一种接口,从而使得原本由于接口不兼容而无法在一起工作的类能够一起工作,如下代码:

// 目标接口,定义客户端需要的方法  
public interface Target {  
    void request();  
}  
  
// 适配器类,继承 OldClass 并实现 Target 接口  
public class Adapter extends OldClass implements Target {  
    @Override  
    public void request() {  
        // 调用 OldClass 的 specificRequest() 方法,并可能进行其他操作以满足客户端需求  
        super.specificRequest();  
        System.out.println("Adapter additional operation.");  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        // 使用适配器类,而不是直接使用 OldClass  
        Target target = new Adapter();  
        target.request(); // 现在可以调用 request() 方法了  
    }  
}

运行上述客户端代码后,输出将会是:

OldClass specific request.  
Adapter additional operation.

通过适配器模式,我们成功地让 Client 能够使用 OldClass 的功能,同时满足了自己对接口的需求。在适配器中,我们可以添加额外的操作或转换来满足客户端的需求。

场景演示

场景一:电源适配器

假设我们有一个Voltage220类提供220V电压,但我们需要一个110V的电压接口,此时,我们可以使用适配器模式将220V电压适配为110V电压,如下代码:

// 目标接口  
public interface Voltage110 {  
    int output110Voltage();  
}  
  
// 已有的类,提供220V电压  
public class Voltage220 {  
    public int output220Voltage() {  
        return 220;  
    }  
}  
  
// 电源适配器类  
public class PowerAdapter implements Voltage110 {  
    private Voltage220 voltage220;  
  
    public PowerAdapter(Voltage220 voltage220) {  
        this.voltage220 = voltage220;  
    }  
  
    @Override  
    public int output110Voltage() {  
        int srcVoltage = voltage220.output220Voltage();  
        int dstVoltage = srcVoltage / 2; // 适配为110V电压  
        return dstVoltage;  
    }  
}  
  
// 客户端调用  
public class Client {  
    public static void main(String[] args) {  
        Voltage220 voltage220 = new Voltage220();  
        PowerAdapter powerAdapter = new PowerAdapter(voltage220);  
        int adaptedVoltage = powerAdapter.output110Voltage();  
        System.out.println("Adapted voltage: " + adaptedVoltage + "V"); // 输出:Adapted voltage: 110V  
    }  
}

场景二:数据格式转换

假设我们有一个老的数据读取接口OldDataReader,它返回的数据格式是XML,但现在我们需要一个返回JSON格式数据的新接口,我们可以使用适配器模式来完成这个转换,如下代码:

// 目标接口,返回JSON格式数据  
public interface NewDataReader {  
    String readDataAsJson();  
}  
  
// 已有的类,返回XML格式数据  
public class OldDataReader {  
    public String readDataAsXml() {  
        return "<data><item>Item1</item><item>Item2</item></data>"; // 示例XML数据  
    }  
}  
  
// 数据格式适配器类  
import org.json.XML; // 假设我们使用org.json库进行XML到JSON的转换  
  
public class DataFormatAdapter implements NewDataReader {  
    private OldDataReader oldDataReader;  
  
    public DataFormatAdapter(OldDataReader oldDataReader) {  
        this.oldDataReader = oldDataReader;  
    }  
  
    @Override  
    public String readDataAsJson() {  
        String xmlData = oldDataReader.readDataAsXml();  
        String jsonData = XML.toJSONObject(xmlData).toString(); // 将XML转换为JSON  
        return jsonData;  
    }  
}  
  
// 客户端调用  
public class Client {  
    public static void main(String[] args) {  
        OldDataReader oldDataReader = new OldDataReader();  
        DataFormatAdapter dataFormatAdapter = new DataFormatAdapter(oldDataReader);  
        String jsonData = dataFormatAdapter.readDataAsJson();  
        System.out.println("Adapted JSON data: " + jsonData); // 输出转换后的JSON数据  
    }  
}

核心总结

程序员必知!抽象工厂模式的实战应用与案例分析 - 程序员古德

适配器模式的优点主要表现在兼容性、透明性、灵活性和解耦四个方面。它能够将已存在的类整合到新的环境中,无需修改原有代码,从而提高了软件的可复用性,客户端通过适配器与目标对象交互,仍能使用一套统一的接口,对客户端透明,简化了客户端的使用。适配器模式将接口与实现分离,降低了系统各部分之间的耦合度,使得系统更加模块化,易于维护。

在实际应用中,适配器模式在处理老旧系统与新系统整合、第三方库的使用以及不同团队或部门间接口不统一等问题上效果显著,它使得原本由于接口不兼容而无法协同工作的类能够合作无间,提高了系统的整体效率和可维护性。比如,在引入新的第三方库时,如果其接口与现有系统不兼容,我们可以通过适配器模式将两者整合在一起,而无需对现有系统进行大规模修改。

适配器模式也存在一些缺点,比如:增加额外类和代码可能导致系统复杂性上升,由于中间层的存在,可能带来一定的性能开销,过多使用适配器会使代码结构变得复杂,影响可读性。

要适度使用适配器模式,只在必要时使用,避免过度复杂化系统,要明确适配器的目标接口,确保其与客户端需求一致。在性能敏感的场景下,需谨慎评估适配器模式带来的性能开销,可以考虑结合其他设计模式如桥接模式、装饰器模式等使用,以应对更复杂的场景。比如,在需要动态添加或删除功能时,可以结合装饰器模式使用;在需要处理多个平台或设备的兼容性问题时,可以结合桥接模式使用。

关注我,每天学习互联网编程技术 - 程序员古德

标签:必知,适配器,OldClass,模式,程序员,接口,public,客户端
From: https://blog.51cto.com/bytegood/9024558

相关文章

  • 00后程序员,2023年终总结
    00后程序员,2023年终总结作为一个00后程序员,我回顾了过去三年的工作经历。我来自湖南衡阳,虽然互联网上常常开玩笑说我们00后炒主管、炒老板,但实际上我们也在不断努力变得更强。最近两年我没有写博客,不是因为懒,而是我荣升为了一位爸爸,肩上的责任更重了,工作上也需要积极主动承担自......
  • 《程序员的修炼之道》第三章读书笔记
    第3章基本工具中,包含了一些常用的工具和技巧,可以提高我们的工作效率和代码质量。以下是这些小节的简要介绍:14.纯文本的威力:纯文本是一种通用的文件格式,它在各种场景中都非常有用。本节介绍了一些处理纯文本的强大工具和技术,比如正则表达式、grep、sed等。15.shell游戏:shell是......
  • 程序员学习网站推荐:路线向导(roadmap.sh)
    网站地址:https://roadmap.sh/在外网的技术论坛上看到这个网站,上面给出多种编程语言的学习路线,也就是给出不同编程语言的从易到难的组成内容(语言特性),通过这个网站可以辅助学习编程语言。比如学习python语言:这个网站并不能给出你不同编程语言的具体学习内容,但是它会给出......
  • windows 网络适配器
     添加虚拟网卡:            https://blog.51cto.com/elasticsearch/5488949如何区分虚拟网卡和物理网卡:           参考:https://blog.csdn.net/EDDJH_31/article/details/82694205 ......
  • Java必知必会系列:机器学习与数据挖掘
    1.背景介绍机器学习和数据挖掘是计算机科学领域的两个重要分支,它们在现实生活中的应用也越来越广泛。机器学习是人工智能的一个分支,它研究如何让计算机自动学习和理解数据,从而实现对未知数据的预测和分类。数据挖掘则是对大量数据进行分析和挖掘,以发现隐藏在数据中的模式和规律,从而......
  • 12.26《程序员的修炼之道》的第二章解读
    第二章的题目是《注重实效的方法》,该章节又分为七小节,每一小节都有一个原则,节节相扣,步步深入,为我们深入的介绍了一些注重实效的方法,我们只要在编程过程中记住这些基本原则,我们就能编写出更快、更好、更强健的代码,甚至可以让这些看起来很容易。  (7)第二章中的第七小节,为我们讲......
  • 《程序员的修炼之道》第二章读书笔记
    第2章《注重实效的途径》是《程序员的修炼之道》中的重要章节,它介绍了一些实践性的方法和技巧,帮助程序员在软件开发中提高效率和质量。在这一章中,作者首先强调了重复的危害。重复的代码和流程可能导致维护难度和出现错误的概率增加。因此,我们需要通过技术手段和工具来减少重复,如自......
  • 程序员视角体验快速搭建智能客服中心
    前言AmazonConnect是亚马逊云科技今年下半年刚推出的全渠道云联络中心服务,仅需简单几步就可以设置属于自己的联系中心,并可以添加任何地方的客服,让它和用户沟通交流。企业级使用者可以通过使用全渠道通信来给企业的客户创建超个性化的体验。另外,据我所知,亚马逊云科技的AmazonC......
  • 设计模式 之适配器模式
    适配器模式(适配器模式)定义==适配器模式==将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。这种做法还有额外的优点,那就是被适配者的任何子类都可以搭配着适配器......
  • vmware vmnat1和vmnat8在真机网络适配器中消失
    在真机的网络适配器中,发现只有两张网卡。缺少vmnat1和vmnat8一,查看虚拟网络编辑器是否连接二,如果没有连接,勾选连接就好了。三,如果连接了,真机网络适配器仍然只有两张网络适配器。1.右键此电脑,管理2.在左侧导航栏选择系统工具,设备管理器。在中间选择展开网络适配器。3.查......