设计模式之第15章-适配器模式(Java实现)
“呔,来着何人,报上名来。”“这是谁啊,我怎么没见过”,“就是啊,我也没印象。”“我当然是适配器了,要不然还能是谁。”适配器模式碎碎念:我不就是昨天把你们的烤串都吃完了么,至于这么对我么。(作者按:嘿嘿,让你抢我东西吃,现在你的脸已被我画的连你妈都不认识了,何况他们乎~),“唉唉,别围着他了,我们先看看他耍什么花招。”
适配器模式之自我介绍
没错,我就是适配器模式,你们可能不是很熟悉,那么说到Adapter你们应该不陌生吧。闲话就不说了,先说下我的定义吧:Convert the interface of a class into another interface clients expect.Adapter lets classes work togther that couldn't otherwise because of incompatible interfaces.意思就是说:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
我的通用类图如下:
类图中的各个图的解释我就不多说了。其实在生活中我还是无处不在的,比如说电源适配器,使电源电压变化,说白了,我就是把一个接口或者类转换成其他的接口或类。
适配器模式之自我分析
首先分析一下缺点:
- 使得重定义Adaptee的行为比较困难,若想重定义需要生成Adaptee的子类,然后用Adapter引用其子类。
优点如下:
- Adapter可以重定义Adaptee的部分行为。
- 允许Adapter与多个Adaptee一起工作。
- 可以让两个没有任何关系的类在一起运行。
- 增加了子类的透明性。
- 提高了类的复用度。
- 灵活性比较好。想用就用,想删就删。
适配器模式之实现
No code,no truth。说的再好,也不如代码管用,所以我就实现一个通用代码。
首先是一个目标接口的代码:
1 public interface Target{ 2 //目标角色自己的方法 3 public void request(); 4 }
然后是目标角色的实现方法:
1 public class ConcreteTarget implements Target{ 2 public void request(){ 3 System.out.println("Nothing is important."); 4 } 5 }
接下来是Adaptee的实现类,代码也会很少:
1 public class Adaptee{ 2 //原有业务逻辑 3 public void doSth(){ 4 System.out.println("I want to eat delicious snacks"); 5 } 6 }
上面就是需要适配的类,在这里的方法什么的就不再多写了。接下来就是重中之重的适配器类的实现了:
1 public class Adapter extends Adaptee implements Target{ 2 public void request(){ 3 super.doSth(); 4 } 5 }
它继承自Adaptee,同时是Target的接口实现,这样一来就将Adaptee和Target联系起来了,最后是测试用的类:
1 public class Client{ 2 public static void main(String[] args) { 3 //原有业务处理 4 Target target = new ConcreteTarget(); 5 target.request(); 6 //现在增加了适配器角色之后的业务逻辑 7 Target target2 = new Adapter(); 8 target2.request(); 9 } 10 }
至此,我的实现就此完成了。
适配器模式之应用场景
怎么样,相信我就是适配器了吧,你们竟然装作不认识我的样子,作者道:赶紧接着讲啊,讲完再说,大家都等着呢。好吧,鱼哥催了,接下来就是应用场景了:
- 你若想使用一个已经存在的类,而它的接口又不符合你的要求时,适配器模式走起。
- 若你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时,适配器模式等着你。
- 当你想使用一些已经存在的子类,但是不可能对每一个都进行子类化时,适配器模式欢迎你。
好了,That's all。荆轲刺秦王,设计模式手中藏。(此时抽象工厂妹纸将镜子拿出递给适配器模式,只听一声尖叫传来:有鬼啊~~~)
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?