1 概述
适配器其实很好理解,生活中也其实充满了适配器,比如:壁式插座是三角孔,而标准的交流电插头是两头的,若需要将两头插头插入三角孔内,则可能需要一个交流电适配器.
该交流电的适配器的作用:位于插头和插座之间,将插头转换为三角插头,将交流电经过一定的转换以匹配插座.
2 Adapter(适配器模式)
定义:适配器模式将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间.
作用:
- ①、通过创建适配器进行接口转换,让不兼容的接口变成兼容,让客户从实现的接口解耦。
- ②、若后续有改变接口,适配器可以将改变部分封装起来,无需客户进行修改。
适配器的分类:
- 对象适配器——“组合”方式适配
- 类适配器——“继承”方式适配
优缺点 | 优点 | 缺点 |
---|---|---|
对象适配器 | ①、采用组合的方式,步进可以适配某个类,也可以适配该类的任何子类。 ②、只需要写很少的代码,将工作委托给适配者,更加有弹性。 |
①、需重新实现整个被适配者。 |
类适配器 | ①、采用继承的方式,无需重新实现整个被适配者,且可以覆盖被适配者的行为。 ②、只需要一个类适配器,不需要一个适配器和一个被适配者。 |
①、只能采用某个特定被适配类。 |
2.1 对象适配器
对象适配器是通过"组合"方式适配.其类图如下:
对象适配器优点:
- ①、采用组合的方式,步进可以适配某个类,也可以适配该类的任何子类。
- ②、只需要写很少的代码,将工作委托给适配者,更加有弹性。
对象适配器缺点:
- ①、需重新实现整个被适配者。
2.2 类适配器
类适配器采用"继承"的方式适配.(类适配器需要多重继承才能实现,而对于Java, PHP是不支持多重继承的)
其类图如下:
类适配器的优点:
- ①、采用继承的方式,无需重新实现整个被适配者,且可以覆盖被适配者的行为。
- ②、只需要一个类适配器,不需要一个适配器和一个被适配者。
类是配器的缺点:
- ①、只能采用某个特定被适配类。
3 适配器模式的应用
假设有一个带有fly()
和gobble()方法的Turkey类。还有一个带有fly()和quack()方法的Duck类。让我们假设你是Duck对象的简称,你想在他们的位置使用Turkey对象。Turkey有一些类似的功能,但实现了不同的接口,所以我们不能直接使用它们。所以我们将使用适配器模式。在这里,我们的客户将是Duck,而adaptee将是Turkey。
(由于PHP并不支持多重继承,因此此处只分析对象适配器的情况)
其类图如下:
1 | // 鸭子接口,具备呱呱叫和飞行的能力. |
参考资料
Head First Design Pattern
适配器模式(https://www.geeksforgeeks.org/adapter-pattern/)