在工作中,会出现两个对象因为接口不兼容不能正常工作,这个时候需要第三方进行适配,比如说,一个人讲中文,另一个将俄语,这个时候需要一个梵音记性转化
适配器模式主要解决在开发过程中需要开发的某种业务功能组件在现有的组件库中已经存在,但是与当前正在写的系统中的接口规范不兼容问题。
定义:将一个类的接口转化为客户希望的另一个接口,是的原本由于接口不兼容而不能在一起工作的类可以在一起工作。适配器模式氛围类结构模式和对象结构模式,前者类之间的耦合度比后者高,需要开发人员了解组件库中组件的内部结构,因此应用较少。
优点:
- 客户端通过适配器可以透明的调用目标接口
- 复用了现存的类,开发人员不需要修改原有代码而是重用现有的适配者类
- 将目标类与适配者类解耦,解决木笔啊类和适配者类接口不一致的问题
缺点:
- 对类适配器来讲,更换适配器实现的过程比较复杂。
结构:
- 目标(Target)接口:当前系统业务所期待的几口,可以是抽象类或者接口
- 适配者(Adaptee)类:被访问和适配的现存组件库中的组件接口
- 适配器(Adapter)类:转化器,通过继承或引用适配者对象,把适配者接口转化为目标接口,让客户按目标接口的格式访问适配者
类适配器
对象适配器
先看类适配器demo
目标接口Target
package adapter.adapterClass; /** * 目标接口 */ public interface Target { void request(); }
适配者接口Adaptee
package adapter.adapterClass; /** * 适配者 也就是现存的接口 */ public class Adaptee { public void specificRequest() { System.out.println("适配者中的业务代码被调用啦~"); } }
类适配器Adapter
package adapter.adapterClass; /** * 适配器 继承适配者并且实现目标接口 */ public class Adapter extends Adaptee implements Target { @Override public void request() { System.out.println("来到了适配器接口,我要去调用适配者"); specificRequest(); System.out.println("调用适配者结束"); } }
客户端
package adapter.adapterClass; /** * 客户端 */ public class Client { public static void main(String[] args) { // 这里制作了一个适配器,因此不使用根据名称来实例话类,直接实例话 Target target = new Adapter(); // 调用接口 target.request(); } }
输出:
来到了适配器接口,我要去调用适配者
适配者中的业务代码被调用啦~
调用适配者结束
对象适配器
对象适配器中的目标接口以及适配者都是一样的,需要将适配器进行修改,以及修改客户端
对象适配器Adapter
package adapter.adapterObject; /** * 适配器 实现目标接口 */ public class Adapter implements Target { private Adaptee adaptee; /** * 构造函数,接受适配者对象,初始化 * @param adaptee 适配者对象 */ public Adapter(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void request() { System.out.println("来到了适配器接口,我要去调用适配者"); // 调用适配者对象的方法,无需知道其内部构造 adaptee.specificRequest(); System.out.println("调用适配者结束"); } }
客户端
package adapter.adapterObject; /** * 客户端 */ public class Client { public static void main(String[] args) { // 实例化适配者对象 Adaptee adaptee = new Adaptee(); // 构建目标,并将适配者对象传入 Target target = new Adapter(adaptee); // 调用接口 target.request(); } }
结果:
来到了适配器接口,我要去调用适配者
适配者中的业务代码被调用啦~
调用适配者结束
源码地址:https://github.com/yang-shixiong/design/tree/master/src/adapter