参考的博客地址来源:https://www.cnblogs.com/mingmingcome/p/9810731.html
具体的说下,我们在适配器模式中主要解决的问题是什么
问题:主要是客户端要求的接口与现有的接口以及类存在着不同的差异,需要通过适配器来解决掉他们之间的差异,完成客户端要求的理想接口
例子:例如mysql中的jdbc连接就是通过适配器模式来解决的,sun公司只是提供一个抽象的接口来允许连接的,而针对jdbc这个抽象开发出来的jdbc驱动软件就是相当于一个适配器角色例如mysql。sqlserver,plsql,oracle等数据库的jdbc连接
再举一个跟生活相贴近的例子就是电源适配器这个产品了,在这里面我们家用的电压是220v,但是手机充电所要求的电压就是5v.所以是需要通过一个电源适配器来对电压做调节的
适配器模式主要是分为三种不同的类型模式:
类适配器模式
对象适配器模式
接口适配器模式-也就是默认的适配器模式-缺省适配器模式
在适配器模式中主要有三个概念可以说下:
目标接口 适配者 适配者角色
下面就是类适配器模式中的电源适配器代码如下:
这下面的代码就是类适配器模式的代码:
/**
* @Author: Jason
* @Create: 2019/12/24 11:05
* @Description 目标接口
*/
public interface TaragetPower {
//主要的就是输出一个5v的电压接口
public int outPut5V();
}
/**
* @Author: Jason
* @Create: 2019/12/24 11:07
* @Description 现有的电压输出类
适配者接口
*/
public class ExistPower {
public int standardPower = 240;
//现有的输出电压为240v
public int outPut240V(){
return standardPower;
}
}
/**
* @Author: Jason
* @Create: 2019/12/24 11:09
* @Description 电源适配器
* 适配器作用
*/
public class AdapterPower extends ExistPower implements TaragetPower {
//主要的作用就是将240V转换成5V的电压
@Override
public int outPut5V() {
int currentPower = outPut240V();
//然后将240v电压转换成5v的电压
return currentPower/48;
}
下面的代码就是对象是适配器的代码:
对象适配器相对于类适配器来讲:最主要的区别就是适配器类的写法不同,
如下就是适配器类的代码写法:前面的目标接口以及适配者类都是一样的
/**
* @Author: Jason
* @Create: 2019/12/24 11:17
* @Description 对象适配器模式
*/
public class PowerAdapterObject implements TaragetPower {
//通过程序员自己新增适配者对象
private ExistPower existPower;
//并且输出到5v
@Override
public int outPut5V() {
//获取到当前的电压也就是240v电压
int currentPower = existPower.outPut240V();
return currentPower/48;
}
}
缺省适配器模式:
所谓的缺省适配器模式主要解决的一个问题就是:在目标接口中,无需实现所有的方法,只需要根据自己的业务需求就实现哪些需求方法
这跟适配器模式的宗旨是不相违背的,因为这是过滤了目标接口中的多余方法,这也算是适配器模式中一种吧
/**
* @Author: Jason
* @Create: 2019/12/24 11:05
* @Description 目标接口
*/
public interface TaragetPower {
//主要的就是输出一个5v的电压接口
public int outPut5V();
//输出1-20的电压数
public int outPut20V();
//输出20-30的电压数
public int outPut30V();
//输出30-50V的电压数
public int outPut50V();
}
/**
* @Author: Jason
* @Create: 2019/12/24 14:20
* @Description 适配角色-一个抽象类并且实现了目标接口中的方法
*/
public abstract class PowerRelnize implements TaragetPower{
@Override
public int outPut5V() {
return 0;
}
@Override
public int outPut20V() {
return 0;
}
@Override
public int outPut30V() {
return 0;
}
@Override
public int outPut50V() {
return 0;
}
}
/**
* @Author: Jason
* @Create: 2019/12/24 14:27
* @Description 测试缺省类所需的类
具体的应用罢了
*/
public class AdapteeTestObject {
//实例化目标接口类
private TaragetPower taragetPower;
public void addTargetPower(TaragetPower taragetPower) {
this.taragetPower = taragetPower;
}
public int outPut5V() {
return taragetPower.outPut5V();
}
public int outPut20V() {
return taragetPower.outPut20V();
}
public int outPut30V() {
return taragetPower.outPut30V();
}
}
/**
* @Author: Jason
* @Create: 2019/12/24 14:32
* @Description 缺省适配器测试类
*/
public class AdapteeTest {
public static void main(String[] args) {
AdapteeTestObject adapteeTestObject = new AdapteeTestObject();
adapteeTestObject.addTargetPower(new PowerRelnize(){
@Override
public int outPut50V() {
return 0;
}
});
}
}
总结: 缺省适配器模式中的流程主要的就是:首先开始定义一个目标接口中的诸多方法,然后就是定义一个抽象类实现目标接口中的方法,然后就是定义一个类来测试添加的接口的类,感觉缺省适配器模式就是在对象适配器模式上增加的一点东西