1.什么是适配器
在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。顾名思义,适配器就是适配相同功能产品的不同规格,使之能够正常使用。在日常生活中,电源适配器就是一个很好的例子,有时候产品需要的电压与我们提供的电压不同,所以我们需要一个电源适配器去转换一下电压,使得产品能够正常使用。
2.适配器分类
适配器分为,类适配器、对象适配、接口适配方式。类适配器方式采用继承方式,对象适配方式使用构造函数传递。
3.适配器代码实现
我们就拿日本电饭煲的例子进行说明,日本电饭煲电源接口标准是110V电压,而中国标准电压接口是220V,所以要想在中国用日本电饭煲,需要一个电源转换器。
首先定义110v和220v的接口和实现。
package com.designpattern.adapter;
/**
* @description: 220V接口
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public interface CN220Interface {
void connect();
}
package com.designpattern.adapter;
/**
* @description: {@link CN220InterfaceImpl}实现220V{@link CN220Interface}接口
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public class CN220InterfaceImpl implements CN220Interface {
@Override
public void connect() {
System.out.println("CN220Interface start to work....");
}
}
package com.designpattern.adapter;
/**
* @description: 110V接口
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public interface JP110Interface {
void connect();
}
package com.designpattern.adapter;
/**
* @description: {@link JP110InterfaceImpl}实现110V{@link JP110Interface}接口
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public class JP110InterfaceImpl implements JP110Interface {
@Override
public void connect() {
System.out.println("JP110Interface start to work....");
}
}
定义一个110v规格的ElectricCooker
。
package com.designpattern.adapter;
/**
* @description: {@link}适配110v{@link JP110Interface}的电饭煲
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public class ElectricCooker {
private JP110Interface jp110Interface;
public ElectricCooker(JP110Interface jp110Interface){
this.jp110Interface = jp110Interface;
}
public void cook(){
jp110Interface.connect();
System.out.println("start to cook....");
}
}
定义一个电压适配器PowerAdapter
。
package com.designpattern.adapter;
/**
* @description: {@link PowerAdapter}定义一个电源适配器,适配器实现{@link JP110Interface},同时内部维护一个{@link CN220Interface}
* 在实现{@link JP110Interface#connect()}的方法时,用{@link CN220Interface#connect()}方法代替
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public class PowerAdapter implements JP110Interface {
private CN220Interface cn220Interface;
public PowerAdapter(CN220Interface cn220Interface){
this.cn220Interface = cn220Interface;
}
@Override
public void connect() {
cn220Interface.connect();
}
}
测试代码
package com.designpattern.adapter;
/**
* @description: 测试电源适配器
* @author: Codegitz
* @create: 2020-05-18 17:03
**/
public class TestAdapter {
public static void main(String[] args) {
//220v的实现
CN220Interface cn220Interface = new CN220InterfaceImpl();
//通过构造函数传入,进行规格转换
PowerAdapter powerAdapter = new PowerAdapter(cn220Interface);
//可把移花接木过的powerAdapter传入110v规格的电饭煲中,此时可以正常工作
ElectricCooker electricCooker = new ElectricCooker(powerAdapter);
electricCooker.cook();
}
}
运行结果:
CN220Interface start to work....
start to cook....
附完整代码,需要自取,顺便点个star。
4.适配器应用场景
我们根据上面的适配器的特点的介绍中,我们来分析下适配器模式的几类比较适用的使用场景:
1、我们在使用第三方的类库,或者说第三方的API的时候,我们通过适配器转换来满足现有系统的使用需求。
2、我们的旧系统与新系统进行集成的时候,我们发现旧系统的数据无法满足新系统的需求,那么这个时候,我们可能需要适配器,完成调用需求。
3、我们在使用不同数据库之间进行数据同步。(我这里只是分析的是通过程序来说实现的时候的情况。还有其他的很多种方式[数据库同步])。
OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。
InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。
SpringMVC 适配器等。