定义与类型
- 定义: 将一个类的接口转变成用户期望的接口,使原本不兼容的类可以一起工作
- 类型: 结构型
角色分析
在适配器模式中,可分为类适配器和对象适配器(区别是适配器角色是采用继承被适配角色还是组合方式来使用被适配角色),但是不管怎么变,都会存在三个角色:
-
Target
目标类,它是客户期望的接口。目标类可以是抽象或者具体的类,也可以是接口 -
Adaptee
需要被适配的类,例如后期维护中新增了厂家,需要对他进行适配 -
Adapter
适配器
模型实现
类适配器(采用继承被适配角色的方式)
-
结构图
Target
/**
* @Author: ming.wang
* @Date: 2019/2/25 16:46
* @Description:
*/
public interface Target {
void finalBusiness();//提供给客户调用的接口
}
Adaptee
/**
* @Author: ming.wang
* @Date: 2019/2/25 16:51
* @Description:
*/
public class Adaptee {
public void changeBusiness(){
System.out.println("需要被适配的方法逻辑");
}
}
Adapter
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:16
* @Description:
*/
public class Adapter extends Adaptee implements Target{
@Override
public void finalBusiness() {
System.out.println("其他的业务逻辑");
super.changeBusiness();
System.out.println("其他的业务逻辑");
}
}
对象适配器(适配器和被适配角色一比一组合,优先考虑)
-
结构图
其中Target和Adaptee是一样的,区别在于Adapter
Adapter
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:16
* @Description:
*/
public class Adapter implements Target {
Adaptee adaptee=new Adaptee();
@Override
public void finalBusiness() {
System.out.println("其他的业务逻辑");
adaptee.changeBusiness();
System.out.println("其他的业务逻辑");
}
}
提出需求
一个生产手机充电器的厂家,产品远销海外。其中中国民用电压为220V,而毗邻而居的日本则为110V,手机需要输入的电压为5V。我们需要适配中国和日本市场。
分析需求
我们使用适配器模式来对需求进行分析,在案例中,中国和日本的不同的民用电压对应在适配器模式中的角色就是需要被适配的对象。手机充电需要输入5V电压,这个就是对应的目标接口。所以我们需要建立一个适配器,来对220V和110V进行适配,使适配后的电压为5v以便给手机充电。
代码实现
-
结构图
DC5-对应的就是Target
public interface DC5 {
int output5V();
}
- AC110和AC220-对应的就是Adaptee
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:30
* @Description:
*/
public class AC110 {
public int output110V(){
System.out.println("输出110V");
return 110;
}
}
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:30
* @Description:
*/
public class AC220 {
public int output220V(){
System.out.println("输出220V");
return 220;
}
}
- DC5Impl-就是系统中原本的业务逻辑
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:20
* @Description:
*/
public class DC5Impl implements DC5 {
@Override
public int output5V() {
System.out.println("需要输出5V电压");
return 5;
}
}
- Adapter
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:32
* @Description:
*/
public class Adapter implements DC5{
private String type;
public Adapter(String type) {
this.type = type;
}
@Override
public int output5V() {
int result=0;
switch (type) {//switch方式可以换成工厂模式
case "110":
{
AC110 ac110=new AC110();
int output220V = ac110.output110V();
//变压
result = output220V / 22;
System.out.println("输入电压:"+output220V+"输出电压:"+result);
}
break;
case "220": {
AC220 ac220=new AC220();
int output220V = ac220.output220V();
//变压
result = output220V / 44;
System.out.println("输入电压:"+output220V+"输出电压:"+result);
}
break;
}
return result;
}
}
-Test
/**
* @Author: ming.wang
* @Date: 2019/2/25 17:39
* @Description:
*/
public class Test {
public static void main(String[] args) {
DC5 dc5=new Adapter("220");
// DC5 dc5=new Adapter("110");
dc5.output5V();
}
}