3分钟学设计模式(结构型):6、适配器模式
共 1870字,需浏览 4分钟
· 2022-03-07
前言
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。
经过汇总的23种设计模式它是总结了面向对象设计当中最有价值的经验。对之前来讲可能是对其中部分设计模式还是相对来说熟悉的但仔细琢磨还是会有些疑问,正好在目前相对来说有更多的业余时间,可以来一次重新学习设计模式!
本篇内容关于结构型设计模式中的适配器模式的设计与实现。
定义
在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。——百度百科
就是说两个东西需要交互连接,或者客户端使用一个产品。但它们两方接口对不上没办法直接使用。这时候需要有一个适配器,让它们建立连接。适配器包裹产品,客户端与适配器进行交互。如下图
type-c与3.5mm的转接器就属于适配器,它可以说是包裹在耳机上,让使用的产品(耳机)提供了type-c的头。也就是让客户端手机可以使用,反过来说也可以。
总之是让客户端想使用的产品但使用不上的产品,通过包裹适配器之后,客户端可以通过适配器使用了原先的产品的功能。
实现
先画个类图,结构大概如下:
![6154fd5453606dc32505cc3ace77a706.webp](https://filescdn.proginn.com/4f8238e4ee88dec7760cdfab4349eb24/6154fd5453606dc32505cc3ace77a706.webp)
上图就是一个简单的设计结构,对于客户端Client实际上想使用产品Product的功能,但对接不上。中间通过适配器,让客户端可以对接到适配器提供的方式,而适配器又能和Product打通。
代码:
class Product{
public void specialReceive(){
....
}
}
class Adapter{
public void receive();
}
class Mydapter implements Adapter{
private Product product;
public Mydapter(Product product){
this.product = product;
}
public void receive(){
// 可能前后有对结果数据进行格式转换,但绝不影响本身内容,只做适配不做增强
this.product.specialReceive();
}
}
class Client{
public void use(){
Adapter adapter = new Myadapter(new Adapter());
adapter.receive();
}
}
对于适配器来说并没有去增强产品的功能,比如只有type-c口的手机使用3.5mm插头的耳机。通过适配器可以使用上,但使用的就是产品本身的功能,适配器并不做额外的增强。
只是在客户端与产品可能它是属于不同的标准,无法去直接使用,所以需要通用标准的适配器去接收客户端标准的内容,再按产品的标准让其可以处理。
它可以适用在一些老旧的库,现在用新的标准去使用。但这些库的功能没必要重写一个新的库或者修改原有库。那么使用适配器是一个很好的选择。
总结
适配器模式总体来说是个比较简单直接的结构型设计模式。它主要处理了,客户端与产品之间交接的部分不适配的问题。客户端通过适配器间接使用目标产品,适配器对与客户端和产品出入交接处进行处理,比如入参协议或者格式不一样。但最终保证客户端正常使用产品功能得到产品处理结果,而不做任何对产品业务逻辑的再处理或者增强。对于不适配的两个体系(客户端、产品)加一个中间层。
单一职责原则,将接口或数据转换代码从程序主要业务逻辑中分离,而不是为了调不适配的接口要在客户端业务代码里面编写调整适配代码后再调用,把这些抽到适配器当中。
开闭原则。只要客户端代码与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加或者修改新类型的适配器,新的适配规则。
![c0fec67c56567ce69eb0948dac2c6094.webp](https://filescdn.proginn.com/c9a3de9506508bfe241f9ed1567e29f3/c0fec67c56567ce69eb0948dac2c6094.webp)
![7088772d367e40a0db30420405949e19.webp](https://filescdn.proginn.com/e9c082f7dbb929aa1f67cf35812d0df9/7088772d367e40a0db30420405949e19.webp)
![ec0d4cc033cceaeba20175f55565fd5e.webp](https://filescdn.proginn.com/2ae7b5a3bbf95ff026786c7c74b5846b/ec0d4cc033cceaeba20175f55565fd5e.webp)
![9a55d7c4fb3e399543791baa887c0bde.webp](https://filescdn.proginn.com/df60b5eb5e0d6b1f16c18ab64b561077/9a55d7c4fb3e399543791baa887c0bde.webp)
END
往期推荐