适配器模式(Adapter)
定义
将一个类的接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一同工作,起别名为包装器(Wrapper)。适配器既可以作为类结构型模式也可以作为对象结构型模型。
说明
适配器要解决的问题是当客户拿到的接口与所期望的接口不相符时,通过适配器能够在不改变原有接口代码的前提下转换成目标接口,以达到接口适配的效果。这里主要体现在不改变原有接口,也能达到获取期望接口的目的。
适配器模式遵循了迪米特法则,客户只与目标接口通信,而不用关心接口的具体实现。无论将来实现部分如何变更,都能够能保证系统具有相同的表示。
适配器模式有利于实现与表示分离,二者可以独立变化而不会相互影响,从而达到解耦的效果。
适配器模式的实现依赖继承和封装原则,有两种具体的实现方法:通过继承实现的适配器为类适配器,通过封装(组合聚合复用原则)实现的适配器为对象适配器。在开发中我们提倡多使用对象适配器,少用类适配器。
类适配器:
对象适配器:
类适配器与对象适配器有不同的权衡,类适配器更容易复写adaptee接口内容,但是一但继承就需要继承所有实现方法及类型,适配器将会变得冗余,安全性也会降低,并且有些语言的继承方式为单继承这样的适配器一次只能适配一个接口。对象适配器可以解决冗余和安全问题,而且一次可以适配多个对象,只是重定义adaptee的行为比较困难。尽管如此我们仍然强烈建议开发中多使用对象适配器。
结构
适配器包含的角色:
target 目标接口 :供Cleint使用的与特定领域相关的接口
adapter 适配器: 将adaptee的接口转换为target规范的接口
adaptee 被适配的部分: 一个已经存在的接口
开发者调用adapter开放的接口,adapter接着去调用adaptee的接口实现。
适配器模式的优势
- 适配器能够将两个没有关系的类运行在一起
- 增加了系统的安全型
- 提高了类的复用度
- 复用现有接口并增强接口功能,提高了系统的可扩展性。
适配器模式的应用
适配器是对系统的一种补救措施,是为了应对变化而生的,通常用来解决接口不兼容问题。
在springmvc源码中有一个HandlerAdpter的接口,该接口的目的是为客户端调用提供一个通用的调用方法,无论以前的接口怎样定义,HandlerAdapter的实现类都要求统一调用handle接口实现原接口的调用,以实现客户端代码的一致性。