设计模式-适配器模式
适配器模式
让一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
主要解决:当需要使用一个现有类而其接口并不符合你的需要时
所属类型:结构型模式
如何解决:依赖或继承
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
优点:1、可以让两个没有关联的类一起运行;2、提高了类的复用;3、增加了类的透明度;4、灵活性好
缺点:过多使用适配器则会非常零乱。
接下来进行一个样例的实现,目的是进行格式的转换,就相当于是格式工厂的工作。
首先是创建一个FormerFactory
用于充当格式工厂的角色,需要传入的参数是原来文件的名称和目标的格式。
public interface FormerFactory {
void changeToForm(String oldForm, String targetForm);
}
接着定义要转换的类型,这里简单列举mp3和mp4格式的实现。
public interface Forms {
void mp3(String target);
void mp4(String target);
}
紧接着对其进行实现,当转换为mp3格式时,仅需要在对应的mp3
方法中进行实现,无需关注其他方法的实现,Mp4Form
类同理。
public class Mp3Form implements Forms {
@Override
public void mp3(String target) {
System.out.println("Change to mp3 form successfully. New file's name is : " + target + ".mp3");
}
@Override
public void mp4(String target) {
}
}
public class Mp4Form implements Forms{
@Override
public void mp3(String target) {
}
@Override
public void mp4(String target) {
System.out.println("Change to mp4 form successfully. New file's name is : " + target + ".mp4");
}
}
这里就对对应的格式进行选择,相当于时一个真正意义上的格式工厂。为了让对应格式进行适配。
public class ChooseForm implements FormerFactory {
Forms forms;
public ChooseForm(String form) {
if (form.contains("mp3")) {
forms = new Mp3Form();
} else if (form.contains("mp4")) {
forms = new Mp4Form();
}
}
@Override
public void changeToForm(String oldForm, String targetForm) {
if (oldForm.contains("mp4") && targetForm.contains("mp3")) {
forms.mp3(oldForm.replace(".mp4", ""));
} else if (oldForm.contains("mp3") && targetForm.contains("mp4")) {
forms.mp4(oldForm.replace(".mp3", ""));
}
}
}
Command
类作为格式转换的入口,在这里将要转换的数据进行输入,并且输入要转换成的数据格式。
public class Command {
public static void main(String[] args) {
ChooseForm chooseForm = new ChooseForm("mp4");
chooseForm.changeToForm("Company.mp3", "mp4");
chooseForm = new ChooseForm("mp3");
chooseForm.changeToForm("Company.mp4", "mp3");
}
}
Tips
简单总结一下,适配器模式做的事情就是适配器干的事情,为了适应一定的条件,就要进行对应的操作,让其适应对应的工作。适配器
将一个对象包装起来以改变其接口,装饰者
将一个对象包装起来以增加新的行为和责任,外观
将一群对象包装起来以简化其接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!