设计模式之适配器模式
适配器模式:用于解决两个系统之间的不兼容问题,解决两个接口之间的连接问题;
目标:将一个类的接口更改为适配另一个类的接口,并且使这些不兼容的类一起工作。
最佳解决方案:两者实现同一个接口或者继承自同一个抽象类
类图UML
实例:
例如有一个抽象类Player是篮球运动员,该类姓名属性,具有两个方法Attack(),Dfend(),现在中国篮球运动员姚明,调到美国NBA,但是他听不懂教练的语言,只能配翻译,
翻译在这个地方就是适配器
Player抽象类
public abstract class Player { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void Attack(); public abstract void Dfend(); }
继承自Player的USAPlayer
public class USAPlayer extends Player { public USAPlayer(String name){ super.setName(name); } @Override public String getName() { return super.getName(); } @Override public void setName(String name) { super.setName(name); } @Override public void Attack() { System.out.println(super.getName()+"正在Attack...."); } @Override public void Dfend() { System.out.println(super.getName()+"正在Dfend...."); } }
现在中国运动员的类
public class ChinaPlayer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void ChinaAttack(){
System.out.println(this.getName()+"进攻....");
}
public void ChinaDfend(){
System.out.println(this.getName()+"防守....");
}
}
为了使教练组能够像调用Player一样ChinaPlayer类
使用翻译类
public class Translater extends Player { private ChinaPlayer chinaPlayer =new ChinaPlayer(); public Translater(String name){ chinaPlayer.setName(name); } @Override public String getName() { return chinaPlayer.getName(); } @Override public void setName(String name) { chinaPlayer.setName(name); } @Override public void Attack() { chinaPlayer.ChinaAttack(); } @Override public void Dfend() { chinaPlayer.ChinaDfend(); } }
主程序代码
public class Main { public static void main(String[] args) { Player p1=new USAPlayer("Jordan"); Player p2=new USAPlayer("James"); Player p3=new Translater("姚明"); p1.Attack(); p1.Dfend(); p2.Attack(); p2.Dfend(); p3.Attack(); p3.Dfend(); } }
运行效果
核心目的,解决两个不兼容的类直接兼容的问题。
类似的还有比如用播放器播放MP3,MP4,AVI等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放
恐惧源于无知,代码改变世界
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义