这是我参与更文挑战的第28天,活动详情查看:更文挑战
前言
适配器模式属于结构型模式,在前面的文章还讲到了代理模式,代理模式也是结构型模式,剩下的结构型模式有桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式,而创建型模式已经全部介绍完了,包括工厂模式、单例模式、建造者模式、原型模式。
什么是适配器模式(Adapter)
概念
适配器模式(Adapter)的定义如下:将一个类的接口转换成用户期待的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
总来说就是为了让A类能够使用B类,新创建一个C类来将B类转化成一个A类能够使用的类。
这个C类就是一个适配器。
就像不懂外语的中国人想跟外国人交流,那得带一个翻译才能够进行交流。像现在支持充电口的手机,想要插有线耳机就要一个转接口。翻译只是帮中国人翻译而已,转接口只是耳机的头转成了合适充电口的头,不会对它们做其他的事情。
类结构适配器和对象结构适配器的对比
要细分的话,可以分为类结构型模式和对象结构型模式两种,前者是是通过继承的方式创建适配器类,耦合程度较高,后者则是通过组合的方式创建适配器类,耦合程度较低,一般使用对象结构型模式的适配器。
从实现角度来看,两者的开发难度都是差不多的,但是由于类结构适配器是采用继承的方式来实现,也可以说是一种静态的实现方式,它和父类会存在较高的耦合程度,想要更换被适配的类会比较麻烦。而对象结构适配器是采用引用对象的方式来实现的,也可以说是一种动态的实现方式,耦合程度低,灵活性较高,内部成员对象采用接口类型引用的话,可以比较灵活地更换对象。
优点
- 符合开放封闭原则,解耦合。可以在不修改A类和B类的情况下,完成需求的更改。
- 提高了类的复用。
- 提高了系统的灵活性。
缺点
- 使系统变得凌乱。过多的使用适配器可能会导致系统结构松散凌乱,应该根据具体的业务需求使用。
- 降低代码可读性。
- 实现过程比较繁琐。
原则
“+”代表遵守,“-”代表不遵守或者不相关
| 原则 | 开放封闭 | 单一职责 | 迪米特 | 里氏替换 | 依赖倒置 | 接口隔离 | 合成复用 |
|---|---|---|---|---|---|---|---|
| + | + | - | - | + | + | - | |
适用场景(动机)
已经开发完成、并且已经在运行的系统一般不会进行一个大幅度地修改,那我们想做出一些改动,就可以使用适配器模式,当然还是要根据需求而定。
- 需要复用一个类,但和现在定义的接口不太一致。
- 封装有缺陷的接口设计。
- 兼容老版本的接口。这三种情况都是在一开始软件设计时留下来的缺陷,但想要修改已经不太可能了,很多地方都用到了这个类。
- 创建一个可以在多处使用的接口,统一多个类的接口设计。
- 适配不同格式的数据。新的改动需要把目标类的返回结果或传入参数修改。
如何实现
想要实现适配器,需要三样东西:
- 目标类:需要被适配的类
- 适配器接口:定义适配器的接口
- 适配器类:适配目标类
类结构适配器
这里做一个类结构适配器的简单实现,各位小伙伴可以发挥想象力去实现更加复杂的例子。
类图
上代码
这里简单实现一下对旧类的一个适配。
目标类:Target
/**
* 目标类
* Created on 2021/5/29.
*
* @author xuxiaobai
*/
public class Target {
public void call(){
System.out.println("call");
}
}
适配器接口:Adapter
/**
* 适配器接口
* Created on 2021/5/29.
*
* @author xuxiaobai
*/
public interface Adapter {
void say();
}
适配器类:TargetAdapter
/**
* 目标类适配器
* Created on 2021/5/29.
*
* @author xuxiaobai
*/
public class TargetAdapter extends Target implements Adapter{
@Override
public void say() {
System.out.print("say replace ");
call();
}
}
测试类:AdapterTest
/**
* Created on 2021/5/29.
*
* @author xuxiaobai
*/
public class AdapterTest {
public static void main(String[] args) {
Adapter adapter = new TargetAdapter();
adapter.say();
/**
输出结果:
say replace call
*/
}
}
对象结构适配器
我把类结构适配器,那对象结构适配器就作为你们的课后作业吧,我不是因为懒,而是为了提高你们的动手能力,下面附上类图。
类图
可以看出来,这里的Target不是使用继承的,而是通过在TargetAdapter中创建一个成员属性来引用这个对象的,TargetAdapter中的这个对象建议使用接口或者抽象类,这里就用本类代替了。
总结
适配器模式基本上遵守了七大设计原则,可以说是一个不错的设计模式,但我们在开发过程中也不会经常性地去使用这个设计模式,一般情况下是当作一个补丁来使用的。
我在学习的过程中也是觉得适配器模式、门面模式和代理模式很像,但没有完全像。
这两种模式都是对一个类进行二次包装,代理模式是要在原来类的基础上增加一些不涉及业务的功能,而适配器模式是为了让旧的类符合接口,一个类能够给另外一个类使用,并没有增加什么新的功能点,还有门面模式的话就是封装了内部的业务逻辑。
——————————————————————————————
你知道的越多,不知道的就越多。
如果本文章内容有问题,请直接评论或者私信我。如果觉得我写得还不错的话,点个赞也是对我的支持哦
未经允许,不得转载!