结构型之适配器模式
序言
适配器模式有3种类型,分别是类的适配器模式,对象的适配器模式,缺省的适配器模式,下面分别介绍。
适配器模式的几种角色:
- 源角色:类,需要适配的对象
- 目标角色:接口或抽象类,包括了需要适配的原有接口和新接口
- 适配器角色:类,通过继承或者委托的方式,实现新旧接口的转化
1. 类的适配器模式
类的适配器结构如下图:
/**
* 原有插座,只提供两孔插座
*/
public class Socket {
public void provideTwoHoles(){
System.out.println("提供两孔插座");
}
}
/**
* 插座接口,有2孔,也有3孔
*/
public interface SocketInterface {
public void provideTwoHoles();
public void provideThreeHoles();
}
/**
* 插座适配器,提供3孔插座和2孔插座
*/
public class SocketAdapter extends Socket implements SocketInterface{
//原有插座没有该方法
public void provideThreeHoles() {
//3孔插座相关代码
//可调用原有插座方法super.provideTwoHoles();
System.out.println("提供3孔插座");
}
}
/**
* 测试对象适配器,提供3孔插座
*/
public class AdapterObjectTest {
@Test
public void testAdapterObject(){
SocketAdapter socketAdapter = new SocketAdapter(new Socket());
socketAdapter.provideThreeHoles();
}
}
吹牛:
好处:适配器类通过继承的方式来完成新旧的转化,而且还可以重写原类中的方法
坏处:只能适配源类,不能适配其子类,当有这样的需求时,每次都要写一个适配器类,比较麻烦
2. 对象的适配器模式
对象的适配器结构如下图:
套路:
1. 将新旧方法统一到接口中
2. 创建适配器类,实现接口,采用委托的形式完成新旧转化
/**
* 原有插座,只提供两孔插座
*/
public class Socket {
public void provideTwoHoles(){
System.out.println("提供两孔插座");
}
}
/**
* 插座接口,有2孔,也有3孔
*/
public interface SocketInterface {
public void provideTwoHoles();
public void provideThreeHoles();
}
/**
* 插座适配器,提供3孔插座和2孔插座
*/
public class SocketAdapter implements SocketInterface {
private Socket socket;
//通过构造方法,初始化原对象
public SocketAdapter(Socket socket){
this.socket = socket;
}
//直接复用原对象方法
public void provideTwoHoles() {
socket.provideTwoHoles();
}
//提供新接口,3孔插口
public void provideThreeHoles() {
//3孔插座相关代码
//可调用原有插座方法super.provideTwoHoles();
System.out.println("提供3孔插座");
}
}
吹牛: 适配器类可以适配多个原类及其子类,比较灵活,较为常用
3. 缺省的适配器模式
具体类实现接口时,具体类会实现接口里所有的方法,可是有时并不需要实现里面所有的方法,这时,缺省的适配器模式就派上用场了,做法是在具体类和接口中间横插一杠子,建一个抽象类,实现接口,但方法体都是空的,让具体类继承抽象类,即可解决该问题。
后记
- 撰写本文时,参考了不少博文,在此谢过各位布道者。
《JAVA与模式》之适配器模式
JAVA设计模式初探之适配器模式
一个示例让你明白适配器模式
适配器模式(Adapter):类适配器、对象适配器- 转载时,请注明出处,这体现了你的人格。
https://www.zybuluo.com/BertLee/note/843667- 能力有限,如有纰漏,请在评论区指出,老朽虽一把年纪,必当感激涕零,泪如雨下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】博客园2025新款「AI繁忙」系列T恤上架,前往周边小店选购
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 通过一个DEMO理解MCP(模型上下文协议)的生命周期
· MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
· 记一次 .NET某固高运动卡测试 卡慢分析
· 微服务架构学习与思考:微服务拆分的原则
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· .net clr 8年才修复的BUG,你让我损失太多了
· 一个神奇的JS代码,让浏览器在新的空白标签页运行我们 HTML 代码(createObjectURL
· 即时通信SSE和WebSocket对比
· 做Docx预览,一定要做这个神库!!