【Java 设计模式】结构型之适配器模式

文章目录

    • 1. 定义
    • 2. 应用场景
    • 3. 代码实现
    • 结语

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端期望的另一个接口。这种模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。在本文中,我们将介绍 Java 中适配器模式的定义、结构、使用场景以及如何在实际开发中应用。

1. 定义

适配器模式是一种结构型设计模式,它允许一个接口转换成另一个接口。它允许原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式通常包含三个主要角色:目标接口(Target)、被适配者(Adaptee)、适配器(Adapter)。

在这里插入图片描述

  • 目标接口(Target): 客户端期望的接口,适配器将被适配者适配成这个接口
  • 被适配者(Adaptee): 需要被适配的类或接口,它与目标接口不兼容
  • 适配器(Adapter): 通过实现目标接口并包装被适配者,使得被适配者的接口能够被客户端调用

2. 应用场景

适配器模式通常在以下场景中使用:

  • 已有类的接口不符合客户端的需求:

    当一个已有类的接口与客户端的需求不匹配时,可以使用适配器模式将已有类的接口适配成客户端期望的接口

  • 需要复用多个现有子类的情况:

    如果需要复用一个或多个已有类的子类,但是这些子类的接口不符合需要,可以通过适配器模式适配这些子类

  • 不希望修改已有类的情况:

    如果不希望修改已有类的代码,但是需要使其与其他类或接口协同工作,可以使用适配器模式

3. 代码实现

下面通过一个简单的例子来演示适配器模式的实现。假设有一个多语言说话器(Speaker)接口,但是目前只支持说中文。现在需要在该多语言说话器中集成说外国话,如 英语。这时就可以使用适配器模式。

目标接口 Speaker

package com.cheney.demo;

public interface Speaker {
    void speak(String country, String something);
}

被适配者接口 AdvancedSpeaker

package com.cheney.demo;

public interface AdvancedSpeaker {
    void speakChinese(String something);

    void speakEnglish(String something);
}

具体的被适配者类 ChineseSpeaker

package com.cheney.demo;

public class ChineseSpeaker implements AdvancedSpeaker{

    @Override
    public void speakChinese(String something) {
        System.out.println("[中文] " + something);
    }

    @Override
    public void speakEnglish(String something) {

    }
}

具体的被适配者类 EnglishSpeaker

package com.cheney.demo;

public class EnglishSpeaker implements AdvancedSpeaker{

    @Override
    public void speakChinese(String something) {

    }

    @Override
    public void speakEnglish(String something) {
        System.out.println("[英文] " + something);
    }
}

适配器类 SpeakerAdapter

package com.cheney.demo;

public class SpeakerAdapter implements Speaker{

    private final AdvancedSpeaker advancedSpeaker;

    public SpeakerAdapter(String country) {
        if (country.equalsIgnoreCase("chinese")) {
            advancedSpeaker = new ChineseSpeaker();
        } else {
            advancedSpeaker = new EnglishSpeaker();
        }
    }

    @Override
    public void speak(String country, String something) {
        if (country.equalsIgnoreCase("chinese")) {
            advancedSpeaker.speakChinese(something);
        } else {
            advancedSpeaker.speakEnglish(something);
        }
    }
}

目标类 PeopleSpeaker

package com.cheney.demo;

public class PeopleSpeaker implements Speaker {
    @Override
    public void speak(String country, String something) {
        // 说中文
        if (country.equalsIgnoreCase("chinese")) {
            System.out.println(something);
        } else {
            // 使用适配器说外语
            SpeakerAdapter speakerAdapter = new SpeakerAdapter(something);
            speakerAdapter.speak(country, something);
        }
    }
}

客户端启动类

package com.cheney.demo;

public class Main {
    public static void main(String[] args) {
        Speaker speaker = new PeopleSpeaker();

        speaker.speak("chinese", "你好!");
        speaker.speak("english", "Hello!");
    }
}

执行结果:

在这里插入图片描述

在上述例子中,Speaker 是目标接口,AdvancedSpeaker 是被适配者接口。ChineseSpeakerEnglishSpeaker 是具体的被适配者类。SpeakerAdapter 是适配器类,通过实现目标接口并包装不兼容的被适配者接口,使得客户端可以通过适配器调用被适配者的功能。PeopleSpeaker 是具体的目标类,负责说话,当说其他国家语言时,通过适配器调用说相应国家的话。

通过适配器模式,我们实现了谈话时对其他国家语言的兼容,而不需要修改原有的说话接口和被适配者类。这使得系统更加灵活,能够方便地扩展和添加新的语言的支持。

结语

适配器模式是一种在面对不同接口的系统集成中非常有用的设计模式。通过适配器,可以使原本不兼容的接口能够协同工作,提高了系统的灵活性和可维护性。在实际开发中,适配器模式常被用于集成第三方库、系统升级和接口兼容等场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/333146.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

骨传导蓝牙耳机怎么使用?使用骨传导耳机对人体有没有伤害?

骨传导蓝牙耳机的使用方法和传统的入耳式蓝牙耳机使用方法相差无几,都是通过蓝牙来进行连接使用,但骨传导耳机会自带内存,所以在此前提上可以存储音乐独立使用,比传统的入耳式蓝牙耳机使用更方便一些。 那么使用骨传导耳机会不会对…

[一]ffmpeg音视频解码

[一]ffmpeg音视频解码 一.编译ffmpeg1.安装vmware虚拟机2.vmware虚拟机安装linux操作系统3.安装ftp和fshell软件4.在Ubuntu(Linux)中编译Android平台的FFmpeg( arm和x86 )5.解压FFmpeg6.Android编译脚本(1)…

Spring Security工作原理(一)

过滤器 Spring Security的Servlet支持是基于Servlet过滤器的,因此首先了解过滤器的一般作用是很有帮助的。下图显示了单个HTTP请求处理程序的典型分层结构。 处理客户端发送的请求时,容器创建一个FilterChain,其中包含Filter实例和Servlet&a…

Rust-泄漏

在C中,如果引用计数智能指针出现了循环引用,就会导致内存泄漏。而Rust中也一样存在引用计数智能指针Rc,那么Rust中是否可能制造出内存泄漏呢? 内存泄漏 首先,我们设计一个Node类型,它里面包含一个指针,可以指向其他…

C++类与对象【友元】

🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🎄1 友元🥑1.1 全局函数做友元🥑1.2 类做友元🥑1.3 成员函数做友元 🕮2 总结 🎄1 友元 生活中你的家…

xml裁剪标注目标并外扩

import glob import xml.etree.ElementTree as ET import cv2 from PIL import Image import os def change_xmlfile(path)

HCIA-H12-811题目解析(11)

1、下列哪个属性不能作为衡量COST的参数? 2、RSTP协议使用P/A机制加快了上游端口转到Forwarding状态的速度,但是却没有出现临时环路的原因是什么? 3、网络管理员在三层交换机上创建了VLAN10,并在该VLAN的虚拟接口下配置了IP地址…

EtherNet/IP协议开发2:在ubuntu测试

下载源码: git clone https://github.com/EIPStackGroup/OpENer编译 首先进入目录 /big/opener/OpENer/bin/posix 执行脚本: lkmaoubuntu:/big/opener/OpENer/bin/posix$ ./setup_posix.sh 执行make lkmaoubuntu:/big/opener/OpENer/bin/posix$ mak…

基于arcgis js api 4.x开发点聚合效果

一、代码 <html> <head><meta charset"utf-8" /><meta name"viewport"content"initial-scale1,maximum-scale1,user-scalableno" /><title>Build a custom layer view using deck.gl | Sample | ArcGIS API fo…

SPEC CPU 2017 quick start

SPEC CPU 2017 quick start 我这里选择在 linux&#xff08;ubuntu22.04.3&#xff09; 上安装 SPEC CPU 2017&#xff0c;gcc、g、gfortran 均使用 sudo apt install xxx 安装&#xff08;其版本为11.4.0&#xff09; 官方的 SPEC CPU 2017 在 Unix Systems 安装示例&#x…

2024-01-18 在Android Studio中,可以通过修改build.gradle文件(位于你的应用模块目录下)来自定义生成的APK名称

一、在Android Studio中&#xff0c;可以通过修改build.gradle文件&#xff08;位于你的应用模块目录下&#xff09;来自定义生成的APK名称&#xff0c;在build.gradle里面增加下面的代码 applicationVariants.all { variant ->variant.outputs.all {outputFileName "…

349. 两个数组的交集(力扣)(OJ题)

题目链接&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 给定两个数组 nums1 和 nums2 &a…

json-server的基础使用

json-server 是什么? 用来快速搭建模拟的 REST API 的工具包 可以30秒内快速为我们搭建一个假的基于 REST API的服务 我们要如何使用呢&#xff1f; 1.先安装 //全局安装 npm i -g json-server 2.创建文件 db.json 我们需要在db.json放入一点内容 放入示例&#xff1a; {/…

用 Python 制作可视化 GUI 界面,一键实现证件照背景颜色的替换

今天&#xff0c;我们来分享一下如何通过Python的十来行代码来替换证件照的背景颜色&#xff0c;那么在最后&#xff0c;小编也会将上述的流程制作成一个GUI界面来方便大家使用。关于界面的大致模样其实和先前的相差不大&#xff0c;大家应该都看过上一篇的内容 界面大体的样子…

Python项目——久坐提醒定时器(PySide6)编写

1、介绍 使用Python编写一个久坐提醒软件。功能&#xff1a; 设置工作时间。设置休息时间。选择休息时是否播放音乐。休息时&#xff0c;软件置顶&#xff0c;且不能关闭。 2、工具 语言&#xff1a;python3.11UI设计工具&#xff1a;Qt designer编译器&#xff1a;PyCharm包…

北斗卫星:助力社区矫正人员追踪与管理的科技突破

北斗卫星&#xff1a;助力社区矫正人员追踪与管理的科技突破 社区矫正人员是一个重要的社会群体&#xff0c;他们的安全和管理对于社会的和谐稳定至关重要。随着技术的飞跃发展&#xff0c;北斗卫星系统作为我国自主研发的卫星导航系统&#xff0c;正逐渐在社区矫正工作中发挥…

《世界之外》提前开测,网易打响国乙大战

1月18日&#xff0c;国乙市场迎来了一场大战。 原定于1月26日开服的网易新乙游《世界之外》&#xff0c;突然宣布在1月18日进行不删档、不限量测试&#xff0c;从某种意义上来说&#xff0c;其实就等同于提前公测。 而同一天开服的还有叠纸的全新3D乙游《恋与深空》&#xff…

比特币狂人引爆达沃斯论坛

点击查看TechubNews原文链接&#xff1a;比特币狂人引爆达沃斯论坛 比特币狂人、自称无政府资本主义者的阿根廷总统米莱在达沃斯的最新演讲引爆社交网络大讨论。 1 月 15 日&#xff0c;第 54 届世界经济论坛在瑞士阿尔卑斯山的达沃斯开幕。来自约 60 个国家首脑和跨国公司的领…

音乐人声分离工具:极简的人声和背景音乐分离工具

这是一个极简的人声和背景音乐分离工具&#xff0c;本地化网页操作&#xff0c;无需连接外网&#xff0c;使用 2stems/4stems/5stems 模型。 将一首歌曲或者含有背景音乐的音视频文件&#xff0c;拖拽到本地网页中&#xff0c;即可将其中的人声和音乐声分离为单独的音频wav文件…

编程笔记 html5cssjs 045 网页布局

编程笔记 html5&css&js 045 网页布局 一、网页布局二、头部区域三、菜单导航区域三、内容区域四、不相等的列五、底部区域六、box-sizingbox-sizing 属性可以被用来调整这些表现&#xff1a;属性值content-boxborder-box 六、响应式网页布局小结 网页布局有很多种方式&…