原创

详解设计模式—适配器模式(Adapter Pattern)

定义

Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)

类对象结构型

角色

  • Target:目标角色
    期望的目标,也就是希望适配者被转换成的角色。

  • Adaptee:适配者
    需要被适配器转换的类,转换的目标就是一个新的目标角色。

  • Adaptor:适配器
    核心角色,对已经存在的适配者进行操作,将其转换为目标角色,这样就能对需要适配的两个类进行最小的改动。

类图

20190720164834418.jpg

使用场景

在对已经存在的接口进行拓展、兼容时,在不修改原有已经存在的类的情况下,适配器模式就是使用的设计模式。

优点

  • 对不相关类的关联性
    也就是适配器模式可以使两个没有关系的类在一起工作。
  • 透明性
    在使用中,访问的是 Target 角色但是背后工作都是适配者提供的,这其实对上层应用其实是透明的。
  • 提高了复用度
  • 可插拔性
    适配器就像转换插头一样,在使用时插上不使用时拔掉即可,对原功能的影响极小。

缺点

  • 类适配器模式的缺点如下:
    对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。
  • 对象适配器模式的缺点如下:
    与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

注意事项

适配器模式多是用来处理已经存在的项目,不适合在新的项目中考虑使用,主要是用来后期拓展的时候考虑使用。

同时,在项目设计的初期一定要遵守依赖倒置原则和里氏替换原则,否则在后期拓展时同样会产生很大的改动。

具体实现

请查看我的 github bigdata-practice/AdaptorPattern.java · GitHub

总结

适配器模式是一个较为简单的设计模式,他作为一个结构型的设计模式,通常情况下是为了后期的兼容性和拓展性采用的一种补偿模式,或者说这是一个补偿模式,在很多时候是不需要使用的。然而需求总是会变得,功能也是重要更新的所以在这些时候还是要想到适配器模式,他能够简化在系统发生变更时面临的很多风险。

参考

设计模式
设计模式之禅
1. 适配器模式 — Graphic Design Patterns

sev7e0
Write by sev7e0
end
本文目录