概述
由于面向对象程序设计本身就是从实际生活中汲取的灵感,将大千世界抽象到程序设计领域,所以所有的设计模式都是可以在日常生活中感受的到的。例如适配器模式,这个在日常生活中就太普遍了。
例如我们程序员经常遇到的电脑上提供的端口与要插入的接头匹配不上,而我们则可以通过一个中间的适配器将两边连接起来。
定义
将一个接口转换为客户端所期待的接口,从而使两个接口不兼容的类可以在一起工作
适配器模式还有个别名叫:Wrapper(包装器),顾名思义就是将目标类用一个新类包装一下,相当于在客户端与目标类直接加了一层。IT世界有句俗语:没有什么问题是加一层不能解决的如果有再加一层
使用场景
- 当需要使用一个现存的类,但它提供的接口与我们系统的接口不兼容,而我们还不能修改它时
- 当多个团队独立开发系统的各功能模块,然后组合在一起,但由于某些原因事先不能确定接口时。
- 新旧系统的兼容问题
- mybaits的日志问题
- 需要一个统一的输出接口,而输入端的类型不可预知。
UML类图
从上图可见,适配器模式只有3个角色
- Target
是一个接口,它是我们客户端使用的目标接口
- Adaptee
我们想要使用的接口与Target不兼容的类,它可以是一个接口,也可以是一个类。
- Adapter
适配器类,此模式的核心。它需要实现目标接口Target,而且必须要引用Adaptee,因为我们要在此类中包装Adaptee的功能
实例
最近小明工作上遇到了一件非常不开心的事:由于老项目中的日志系统非常粗糙,导致小明debug时候非常吃力,为此都加了好几次班了,于是小明调研了一个非常棒的三方开源日志库来改进项目的log系统,但是此开源库与项目中接口不兼容 (肯定的,兼容了也不用你在重构了),所以小明又一次展现出了其高超的程序设计能力,精准的采用了适配器模式来完成这个功能。
目标接口
系统原来的日志接口如下
public interface LogFactory {
void debug(Strin