文章目录
- 一、概念
- 二、角色
- 三种形式
- 1. 类适配器
- 对象适配器
- 接口适配器
- 优缺点
- 优点:
- 缺点
一、概念
适配器模式(Adapter Pattern)又叫做变压器模式,它的功能是将一个类的接口变成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能在一起工作。属于结构型模式
二、角色
适配器模一般包含三种角色:
目标角色(Target):也就是我们期望的接口;
源角色(Adaptee):存在于系统中,内容满足客户需求(需转换),但接口不匹配的接口实例:
适配器(Adapter):将源角色(Adaptee)转化为目标角色(Target)的类实例;
三种形式
场景:在中国民用电都是220V交流电,但我们收集使用的锂电池使用的5V直流电。因此我们给手机充电时就需要使用电源适配器来进行转换。
1. 类适配器
通过继承来实现适配器功能。
Adaptee角色,需要被转换的对象AC220类,表示220V交流电:
public class AC220 {public int outputAC220V(){int output = 220;System.out.println("输出电压"+output+"V");return output;}
}
Target角色DC5接口,表示5V直流电的标准:
public interface DC5 {int output5V();
}
创建Adapter角色电源适配器PowerAdapter类:
public class PowerAdapter extends AC220 implements DC5{@Overridepublic int output5V() {int adapterInput=super.outputAC220V();int adapterOutput=adapterInput/44;System.out.println("使用Adapter输入AC"+adapterInput+"V,输出DC"+adapterOutput+"V");return adapterOutput;}
}
客户端测试代码:
public class Test {public static void main(String[] args) {DC5 powerAdapter = new PowerAdapter();powerAdapter.output5V();}
}
对象适配器
通过持有Adaptee对象实现适配器功能。具体做法:Adapter类实现Target接口,然后内部持有Adaptee实例,然后再Target接口规定的方法内转换Adaptee。
public class PowerAdapter implements DC5 {private AC220 ac220;@SuppressWarnings("all")public PowerAdapter(AC220 ac220){this.ac220 = ac220;}@Overridepublic int output5V() {int adapterInput = ac220.outputAC220V();int adapterOutput = adapterInput / 44;System.out.println("使用Adapter 输入AC"+adapterInput+"V,输出DC"+adapterOutput+"V");return adapterOutput;}
}
接口适配器
创建Target角色DC类:
public interface DC {int output5V();int ouptut12V();int output24V();int output36V();}
创建Adaptee角色AC220类:
public class AC220 {public int outputAC220V() {int output=220;System.out.println("输出电压"+220+"V");return output;}
}
创建Adapter角色PowerAdapter类:
public class PowerAdapter implements DC{private AC220 ac220;@SuppressWarnings("all")public PowerAdapter(AC220 ac220){this.ac220 = ac220;}@Overridepublic int output5V() {int adapterInput = ac220.outputAC220V();int adapterOutput = adapterInput/44;System.out.println("使用Adapter输入AC"+adapterInput+"V,输出DC"+adapterOutput+"V");return adapterOutput ;}@Overridepublic int ouptut12V() {return 0;}@Overridepublic int output24V() {return 0;}@Overridepublic int output36V() {return 0;}
}
客户端代码:
public class Test {public static void main(String[] args) {DC adapter = new PowerAdapter(new AC220());adapter.output5V();}
}
优缺点
优点:
- 能提高类的透明性和复用,现有的类复用但不需要改变。
- 目标类和适配器类解耦,提高程序的扩展性。
- 在很多业务场景中符合开闭原则。
缺点
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。