Java常用设计模式-适配器模式

简介: Java常用设计模式-适配器模式

适配器模式是指把一个类的接口转换成另一个接口,使得原本不相兼容的类可以一起工作,属于结构型设计模式。可以说,适配器模式主要是解决功能兼容性问题

我们都知道:在日常生活中,我们的电源插座都是220V的交流电,因此给手机充电都需要一个电源适配器进行转换,这个手机的电源适配器(也就是充电器)就是一个起着转换作用的角色。

我们用代码来模拟一下这个场景。

1,创建220V交流电(原始功能)

创建220V交流电类如下:

packagefun.swsk33site.adapter.model;
/*** 220V交流电*/publicclassAC220V {
/*** 接入交流电并获取** @return 获取到220V交流电*/publicintoutput() {
return220;
   }
}

这个类就可以得到220V的电流了!但是这个无法直接使用,因此需要做转换。

2,创建适配器接口,并实现各个适配器(适配器,用于转换原始功能)

电源适配器并非只有一种,比如华为40W快充和苹果的充电器就不一样,因此我们要把适配器先抽象为一个接口,再去实现各个适配器:

packagefun.swsk33site.adapter.adapter;
/*** 电源适配器接口*/publicinterfacePowerAdapter {
/*** 对输入电源作转换** @return 转换后电流*/intdoConvert();
}

实现华为40W快充适配器:

packagefun.swsk33site.adapter.adapter.impl;
importfun.swsk33site.adapter.adapter.PowerAdapter;
importfun.swsk33site.adapter.model.AC220V;
/*** 华为40W快充适配器*/publicclassHuaweiFastChargeimplementsPowerAdapter {
privateAC220Vac220V;
/*** 构造器依赖注入(模拟华为充电器接入220V交流电)** @param ac220V 接入的交流电*/publicHuaweiFastCharge(AC220Vac220V) {
this.ac220V=ac220V;
   }
@OverridepublicintdoConvert() {
// 转换为10V电流intoutput=ac220V.output() /22;
returnoutput;
   }
}

实现苹果5W手机充电器:

packagefun.swsk33site.adapter.adapter.impl;
importfun.swsk33site.adapter.adapter.PowerAdapter;
importfun.swsk33site.adapter.model.AC220V;
/*** 苹果5V手机充电器*/publicclassAppleChargeimplementsPowerAdapter {
privateAC220Vac220V;
/*** 构造器依赖注入(模拟苹果充电器接入220V电源)** @param ac220V*/publicAppleCharge(AC220Vac220V) {
this.ac220V=ac220V;
   }
@OverridepublicintdoConvert() {
intoutput=ac220V.output() /44;
returnoutput;
   }
}

可见,不同的适配器都对原始的功能进行了转换,只不过转换的方式不一样。

3,使用适配器

我们在主方法中试一下子:

PowerAdapterhuaweiAdapter=newHuaweiFastCharge(newAC220V());
System.out.println("华为充电器,得到电压:"+huaweiAdapter.doConvert());
PowerAdapterappleAdapter=newAppleCharge(newAC220V());
System.out.println("苹果充电器,得到电压:"+appleAdapter.doConvert());

结果:

网络异常,图片无法展示
|

4,总结

可见适配器模式主要是做了一个转换和兼容的工作。适配器中输入的是原始功能(220V交流电),而输出的是转换后兼容的功能(10V或者5V直流电),至于转换的逻辑,当然就是放在适配器类中了!其实还是很简单的。

通常适用于以下场景:

  • 已经存在的类和需求不匹配
  • 软件系统升级之后,不同的功能导致了不兼容问题

事实上,我们很多网站都有登录功能,除了可以密码登录之外,还可以QQ或者微信登录。这么多登录方式是如何组织起来的呢?其实使用适配器模式+策略模式即可完成。这样登录形式丰富了,但是后台的处理逻辑几乎不用怎么变,符合开闭原则。

上述示例的类图如下:

网络异常,图片无法展示
|

示例仓库地址

相关文章
|
13天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
31 0
[Java]23种设计模式
|
29天前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
2月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
2月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
2月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)
|
2月前
|
设计模式 运维 算法
Java设计模式-策略模式(15)
Java设计模式-策略模式(15)
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
29天前
|
设计模式 Java
Java设计模式
Java设计模式
26 0