当前位置:网站首页>适配器模式
适配器模式
2022-08-05 12:40:00 【老蛙@】
基本介绍
- 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作
- 适配器模式属于结构型模式
- 适配器主要分为三类:类适配器、对象适配器、接口适配器
工作原理
- 适配器模式即将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容
- 从caller角度看不到适配者,是解耦的
- caller调用适配器转换出来的目标接口的方法,适配器再调用被适配者的相关接口
- caller收到反馈结果并不知道过程,感觉就是在与目标接口交互
电压问题
假设当前电源电压(src)为220V,而手机充电口需要的电压(dst)是5V,使用适配器将电压进行转换
类适配器
Adapter类通过继承src类,实现dst类接口,在dst接口中调用src中的方法,完成src->dst的适配
类适配器解决电压问题
/*** * @author shaofan * @Description 类适配器解决电压问题 */
public class ClassAdapter {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
class Phone{
public void charging(Voltage5V voltage5V){
System.out.println("充电电压为"+voltage5V.output5V()+"V");
}
}
class Voltage220V{
int output220V(){
return 220;
}
}
interface Voltage5V{
int output5V();
}
class VoltageAdapter extends Voltage220V implements Voltage5V{
@Override
public int output5V() {
//将源电压转为目标电压5V
int src = output220V();
int dst = src/44;
return dst;
}
}
类适配器注意事项
- Java是单继承机制,所以类适配器需要继承src类算是一个缺点,因为这要求了dst只能是接口,有一定的局限性
- src类的方法在Adapter中都会暴露出来,也增加了使用的成本
- 由于继承了src类,所以可以根据需求重写src类的方法,增加了灵活性
对象适配器
- 基本思路和类适配器相同,只是将Adapter类作修改,不再继承src类,而是根据合成复用原则,持有src类的实例,来解决兼容问题
- 对象适配器是常用的一种适配器模式
对象适配器解决电压问题
/*** * @author shaofan * @Description 对象适配器解决电压问题 */
public class ObjectAdapter {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
class Phone{
public void charging(Voltage5V voltage5V){
System.out.println("充电电压为"+voltage5V.output5V()+"V");
}
}
class Voltage220V{
int output220V(){
return 220;
}
}
interface Voltage5V{
int output5V();
}
class VoltageAdapter implements Voltage5V {
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V){
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
//将源电压转为目标电压5V
int src = voltage220V.output220V();
int dst = src/44;
return dst;
}
}
对象适配器注意事项
- 对象适配器和类适配器是同一种思想,只不过实现方式不同,根据合成复用原则,使用组合替代继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口
- 使用成本更低,更灵活
接口适配器模式
- 当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口中每一个方法提供一个默认实现(空方法),改抽象类的子类可以有选择的覆盖父类的某些方法
- 适用于一个接口不想使用其所有方法的情况
接口适配器解决电压问题
/*** * @author shaofan * @Description 接口适配器解决电压问题 */
public class InterfaceAdapter {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging();
}
}
class Phone{
public void charging(){
// 在调用时只对需要用到的方法进行实现
AbstractAdapter adapter = new AbstractAdapter() {
@Override
public int output5V() {
return 5;
}
};
System.out.println("充电电压为"+adapter.output5V()+"V");
}
}
interface Voltage{
int output5V();
int output3V();
}
/*** * 适配器对接口中的方法进行空实现 */
abstract class AbstractAdapter implements Voltage{
@Override
public int output5V() {
return 0;
}
@Override
public int output3V() {
return 0;
}
}
总结
- 适配器模式分为三类,是根据src是以怎样的形式给到Adapter来命名的
- 类适配器:以类给到,在Adapter将src当作类,继承;对象适配器:以对象给到,在Adapter将src作为一个对象,持有;接口适配器:以接口给到,在Adapter,将src作为一个接口,实现
- Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作
边栏推荐
- 基于深度图的目标检测
- RK3568+Hongmeng Industrial Flat Panel Industrial Kanban Solution Design
- InnoDB storage structure of MySQL
- Query optimization (TTFB is too long) left join index does not take effect
- Should you migrate your monolithic architecture to microservices?
- Small household appliance industry supply chain collaborative management system: help enterprises break through market competition and strengthen the rapid response capability of the supply chain
- WPF development essays - WriteableBitmap to draw high-performance graphs
- likeshop搭建商城系统,一步到位
- 微信开发者工具更换默认用户存储目录方法,将C盘数据User Data迁移到D盘
- 快可电子深交所上市:市值82亿 年营收7亿募资5.6亿
猜你喜欢

RK3568+Hongmeng Industrial Flat Panel Industrial Kanban Solution Design

Bit rate vs. resolution, which one is more important?

The Open-Closed Principle (OCP) of the Seven Principles of Software Design

【Untitled】

为了高性能、超大规模的模型训练,这个组合“出道”了

该不该将单体架构迁移到微服务?

Sentinel introduction and use
![LeetCode 623 在二叉树中增加一行[BFS DFS] HERODING的LeetCode之路](/img/e1/6df6132cd030b0e32dcbdc2b41ba94.png)
LeetCode 623 在二叉树中增加一行[BFS DFS] HERODING的LeetCode之路

一致性协议-ChainPaxos详解

Query optimization (TTFB is too long) left join index does not take effect
随机推荐
Huawei Analysis & Intermodal Activities to Help You Improve Overall Game Payments
The fourth SQL general command (DML)
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...
【Untitled】
Shang Silicon Valley-JVM-Memory and Garbage Collection (P1~P203)
基于深度图的目标检测
Grid Infrastructure Installation Fails with Error
C language example - print calendar
一次多表关联顺序的慢查询——TiDB 关联特性
《Grandmaster level in StarCraft II using multi-agent reinforcement learning》翻译
2022.08.03_Daily Question
Top 10 new features in Oracle Database 19c at a glance
AVL树大总结
基于 nacos/灰度发布 实现减少本地启动微服务数量的实践
WPF开发随笔收录-WriteableBitmap绘制高性能曲线图
MySQL之InnoDB存储结构
浅解排列与组合
码率vs.分辨率,哪一个更重要?
NFT card game system dapp develops NFT chain game technology
Weak network test (1)