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

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

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

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

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

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

举例

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

播放电影接口如下:

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

电影播放器类如下:

/*** 电影播放器*/
public class MoviePlayer implements Player{@Overridepublic 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  翻译的内容*/@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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();}
}

运行如下:

运行截图

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯选拔赛真题10】C++求奇数和 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++求奇数和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 <

在二维矩阵/数组中查找元素 Leetcode74, Leetcode240

这一类题型中二维数组的元素取值有序变化&#xff0c;因此可以用二分查找法。我们一起来看一下。 一、Leetcode 74 Leetcode 74. 搜索二维矩阵 这道题要在一个二维矩阵中查找元素。该二维矩阵有如下特点&#xff1a; 每行元素 从左到右 按非递减顺序排列。每行的第一个元素 …

速学数据结构 | (超级干货)业界程序员公认的实现栈最简单的方法!太简单了

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525;个人专栏:《Linux深造日志》《C干货基地》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 &#x1f308;hello&#xff01; 各位铁铁们大家好啊&#xff0c;今天来给大家更新一下栈这个数据结构,…

STM32笔记-AD模数转换

目录 一、ADC介绍 二、ADC主要特征 三、ADC框图 1. ​​​​ 外部触发转换 ​ 2. 转换模式 3. 输入通道 4. 逻辑框图 四、校准 五、数据对齐 六、AD转换步骤 七、AD_Init(单通道AD转换)初始化函数配置 一、ADC介绍 1. 12位ADC是一种逐次逼近型模拟数字转换器。它有多达…

R语言中的自带的调色板--五种--全平台可用

R语言中的自带的调色板–五种–全平台可用

逆袭Flutter? Facebook 发布全新跨平台引擎 Hermes!

Facebook 于前日发布了新的 JavaScript 引擎&#xff1a;Hermes&#xff0c;专注于提高 React Native 应用的性能&#xff0c;并且在市面上那些内存较少、存储速度较慢且计算能力低下的移动设备上都有良好的表现。但是不是为了追赶Flutter&#xff1f;这块作者没有说明。 移动应…

天空卫士为集度智能汽车系上“安全带”

10月27日&#xff0c;集度汽车在北京正式发布了旗下首款量产车型——极越 01 SUV。极越 01 SUV 是一款集科技、智能、美学于一身的纯电动中大型SUV&#xff0c;号称全球首款“AI 汽车机器人”。作为集度的合作伙伴&#xff0c;天空卫士第一时间送上祝福&#xff0c;祝愿极越大卖…

ElasticSearch深度解析入门篇:高效搜索解决方案的介绍与实战案例讲解,带你避坑

ElasticSearch深度解析入门篇&#xff1a;高效搜索解决方案的介绍与实战案例讲解&#xff0c;带你避坑 1.Elasticsearch 产生背景 大规模数据如何检索 如&#xff1a;当系统数据量上了 10 亿、100 亿条的时候&#xff0c;我们在做系统架构的时候通常会从以下角度去考虑问题&a…

根据Word模板,使用POI生成文档

突然想起来有个小作业&#xff1a;需要根据提供的Word模板填充数据。这里使用POI写了一个小demo验证下。 测试用模板&#xff1a; 执行结果 1.引入依赖坐标 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId&…

初学Flutter:swiper实现

效果展示&#xff1a; flutter swiper 1、安装 card_swiper 2、引入card_swiper import package:card_swiper/card_swiper.dart;3、使用 这里我主要是对官网例子进行实践&#xff0c;主要是5种常用的swiper 1、普遍的swiper //custom swiper class CustomSwiper extends S…

代码随想录算法训练营第23期day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 一、动态规划理论基础 1.动态规划的解题步骤 2.动态规划应该如何debug 二、&#xff08;leetcode 509&#xff09;斐波那契数 1.递归解法 2.动态规划 1&#xff09;确定dp数组以及下标的含义 2&#xff09;确定递推公式 3&#xff09;dp数组如何初始化 4&#x…

20.5 OpenSSL 套接字RSA加密传输

RSA算法同样可以用于加密传输&#xff0c;但此类加密算法虽然非常安全&#xff0c;但通常不会用于大量的数据传输&#xff0c;这是因为RSA算法加解密过程涉及大量的数学运算&#xff0c;尤其是模幂运算&#xff08;即计算大数的幂模运算&#xff09;&#xff0c;这些运算对于计…