设计模式—结构型模式之适配器模式

设计模式—结构型模式之适配器模式

将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

别名也可以是Wrapper,包装器。

适配器模式(Adapter)包含以下主要角色。

  • 目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口。
  • 适配者(Adaptee)类:隐藏的转换接口。
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。

举例

比如我们需要一个播放器类,可以根据不同的国家提供相应字幕的功能。我们不应该修改播放器,我们需要写一个适配器类,来进行字幕转换。

播放电影接口如下:

/**
 * 提供原有接口,可以播放电影,并且返回字幕
 */
public interface Player {
    String play();
}

电影播放器类如下:

/**
 * 电影播放器
 */
public class MoviePlayer implements Player{
    @Override
    public String play() {
        String content = "你好,世界!";
        //打印字幕
        System.out.println(content);
        return content;
    }
}

如果是我们自己看的话,直接进行如下操作即可:

public class AdapatorTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        moviePlayer.play();
    }
}

但是如果有一个以英文为语言的人来看的话,就不行了。

所以我们需要一个适配器,来为英文适配。

翻译文本内容的接口如下:

/**
 * 提供接口,翻译文本内容
 */
public interface Translator {
    String translate(String content);
}

中文翻译为英文的类如下;

/**
 * 中文---》英文的翻译器
 */
public class ZhToEnTranslator implements Translator{
    /**
     * 简单示意翻译
     * @param content 需要翻译的内容
     * @return  翻译的内容
     */
    @Override
    public String translate(String content) {
        //省略判空
        if(content.contains("你好")){
            content = content.replace("你好","Hello");
        }
        if(content.contains("世界")){
            content = content.replace("世界","World");
        }
        return content;
    }
}

运行如下:

运行截图

类适配器

使用继承的方式来进行适配。

英文适配器如下:

/**
 * 做英文适配
 */
public class EnglishMoviePlayerAdapter extends ZhToEnTranslator implements Player {
    //被适配对象
    private Player target;

    public EnglishMoviePlayerAdapter(Player target) {
        this.target = target;
    }

    @Override
    public String play() {
        String play = target.play();
        //翻译
        String translate = translate(play);
        System.out.println("English:"+translate);
        return translate;
    }
}

测试如下:

public class ClazzAdapaterTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
        englishMoviePlayerAdapter.play();
    }
}

运行如下:

运行截图

对象组合适配器

使用对象组合的方法来进行适配

/**
 * 做英文适配
 */
public class EnglishMoviePlayerAdapter implements Player {
    
    private Translator translator = new ZhToEnTranslator();
    
    //被适配对象
    private Player target;

    public EnglishMoviePlayerAdapter(Player target) {
        this.target = target;
    }

    @Override
    public String play() {
        String play = target.play();
        //翻译
        String translate = translator.translate(play);
        System.out.println("English:"+translate);
        return translate;
    }
}

测试类如下:

public class ObjAdapaterTest {
    public static void main(String[] args) {
        MoviePlayer moviePlayer = new MoviePlayer();
        EnglishMoviePlayerAdapter englishMoviePlayerAdapter = new EnglishMoviePlayerAdapter(moviePlayer);
        englishMoviePlayerAdapter.play();
    }
}

运行如下:

运行截图

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

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

相关文章

【教3妹学编程-算法题】重复的DNA序列

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包” 2哥 :3妹,什么事呀这么开心呀。 3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。 2哥&…

语言的新启程之Solidity

官方网站 WTF-Solidity官网 编译器 区块链的基础 Gas 一经创建,每笔交易都收取一定数量的 gas,目的是限制执行交易所需要的工作量和为交易支付手续费。EVM 执行交易时,gas 将按特定规则逐渐耗尽。 gas price 是交易发送者设置的一个值&…

python模块的介绍和导入

python模块的介绍和导入 概念 在Python中,每个Python代码文件都是一个模块。写程序时,我们可以将代码分散在不同的模块(文件)中,然后在一个模块中引用另一个模块的内容。 导入格式 1、在一个模块中引用(导入)另一个模块可以使用import语句…

抖音极速版app拉新一手申请渠道 附快手极速版app拉新申请资料

抖音极速版app拉新一手申请渠道 附快手极速版app拉新申请资料 通过“聚量推客”申请,价格更高 抖音极速版app拉新是地推百搭项目,部分团队作为主打项目推广,流程简单只需要新设备即可,如果你能做次留或者7日留存价格还是很可观的…

非线性【SVM】的创建和使用

先来绘制散点图: from sklearn.datasets import make_circles X,y make_circles(100, factor0.1, noise.1) # 100个样本,factor:内圈和外圈的距离之比,noise:噪声 X.shape y.shape plt.scatter(X[:,0],X[:,1],cy,s50,cmap"rainbow&qu…

zabbix6.4监控centos

1、关闭防火墙 setenforce 0 #关闭SELinux sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config #设置永久关闭SELinux systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service …

腾讯云服务器CVM S5服务器CPU性能测评和优惠价格表

腾讯云服务器CVM标准型S5有活动,CVM 2核2G S5优惠价280.8元一年自带1M带宽,15个月313.2元、2核4G配置748.2元15个月、4核8G配置1437.24元15个月、8核16G优惠价3048.48元15个月,公网带宽可选1M、3M、5M或10M,腾讯云服务器网txyfwq.…

SpringBoot项目打包与运行

1.clean生命周期 说明:为了项目能够正确打包,先清理打包文件。 2.package生命周期 说明:打包后生成以下目录。 2.1问题 说明:springboot_08_ssmp-0.0.1-SNAPSHOT.jar中没有主清单属性。 2.2解决 说明:注释skip&…

jar包的精细化运营,Java模块化简介 | 京东云技术团队

图:模块化手机概念 一、什么是Java模块化 Java模块化(module)是Java9及以后版本引入的新特性。 官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which is a named, self-descri…

Rocky9 上安装 redis-dump 和redis-load 命令

一、安装依赖环境 1、依赖包 dnf -y install perl gcc gcc-c zlib-devel2、编译openssl 1.X ### 下载编译 wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar xf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ./config --prefix/usr/local/openssl make make ins…

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG 文章目录 导入库初始化PWM开启PWMPWM硬件BUG附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from misc import PWM_V2或者 from misc import PWM但我觉得PWM_V2好用 初…

【Linux】基础IO之文件操作(文件fd)——针对被打开的文件

系列文章目录 文章目录 系列文章目录前言浅谈文件的共识 一、 回忆c语言对文件操作的接口1.fopen接口和cwd路径2.fwrite接口和"w","a"方法3.fprintf接口和三个默认打开的输入输出流(文件) 二、过渡到系统,认识…

嵌入式中利用VS Code 远程开发原理

VS Code几乎是所有的程序员必备的工具之一,据说全球一般的开发者都使用过VS Code这款工具。 今天分享一篇 VS Code 实现远程办公相关的文章。 1、概 述 通常,我们都是每天到工作的办公室进行办公,但是,如果下班回家&#x…

chrome 扩展 popup 弹窗的使用

popup的基本使用方法 popup介绍 popup 是点击 browser_action 或者 page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。 popup配置 V3版本中(V2版本是在 browser_action 中 )&#x…

用户自定义消息及层次划分

有些人对术语 WM_USER 表示消息范围基的名称有不同的意见,因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是,用户不能使用它们,因为它们属于窗口类定义的一部分。 但是,问题是,”这里的用户是谁?”…

【IDEA】在工具栏设置快速创建包和类的图表

页面效果: 操作步骤: 设置 --> 外观与行为 --> 菜单与工具栏 --> 点击 主工具栏 --> 点击 ---- --> 点击 号 --> 添加操作 主菜单 --> 文件 --> 文件打开操作 --> 打开项目操作 --> 新建 --> 往下找 找到 clas…

模型应用系实习生-模型训练笔记(更新至线性回归、Ridge回归、Lasso回归、Elastic Net回归、决策树回归、梯度提升树回归和随机森林回归)

sklearn机械学习模型步骤以及模型 一、训练准备(x_train, x_test, y_train, y_test)1.1 导包1.2 数据要求1.21 导入数据1.22 数据类型查看检测以及转换1.22 划分数据 二、回归2.1 线性回归2.2 随机森林回归2.3 GradientBoostingRegressor梯度提升树回归2…

HarmonyOS列表组件

List组件的使用 import router from ohos.routerEntry Component struct Index {private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]build() {Row() {Column() {List({ space: 10 }) {ForEach(this.arr, (item: number) > {ListItem() {Text(${item}).width(100%).heig…

大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)

大语言模型对齐(Large Language Model Alignment)是利用大规模预训练语言模型来理解它们内部的语义表示和计算过程的研究领域。主要目的是避免大语言模型可见的或可预见的风险,比如固有存在的幻觉问题、生成不符合人类期望的文本、容易被用来执行恶意行为等。 从必…

账户权限控制

1.首先配置一个单群组4节点的链 1.1创建操作目录 cd ~ && mkdir -p fisco && cd fisco 1.2下载国内脚本 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod ux bu…