适配器(Adapter)模式:将一个类的接口转换为另一个接口,使得原来不兼容的类相互兼容。适配器模式分为:类适配器和对象适配器模式,前者的耦合度比后者要高,并且类适配器通过继承来完成适配,对象适配器则是通过关联来完成。
优点:
- 通过适配器可以更加透明的调用目标接口
- 复用现存的类,而无需修改太多
- 解耦适配者和目标类,解决了二者接口不一致问题
缺点:
- 需要结合系统业务考虑,会增加复杂性
- 降低了代码的可读性,适配器过多反而会使代码变得凌乱
结构:
- 目标对象:用户期待的连接口,适配器类即将要进行适配的抽象类或接口;
- 适配者: 可以是内部的类或服务,也可以是外部对象或服务。
- 适配器:可以是类或接口,是作为具体适配者类的中间类来使用;
类适配器示例:
这一实现使用了继承机制: 适配器同时继承两个对象的接口,但是由于JAVA是单继承语言,所以需要配合接口去做
public static void main(String[] args) {Target target = new Adapter();target.request();}// 目标接口interface Target{void request();}// 适配者static class Adaptee {public void specificRequest(){System.out.println("适配者");}}// 适配器static class Adapter extends Adaptee implements Target{@Overridepublic void request() {// 可以在这里进行自定义的一些适配操作specificRequest();}}
对象适配器示例:
实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一个对象进行封装。 下面列举了一个电压适配的案例:我国居民用电为220V,手机充电一般只需要5V,所以需要将220V转换为5V
public class AdapterDemo {public static void main(String[] args) {AdapterAC220 ac110 = new AdapterAC220();String ac = ac110.outputDC5V(new AC220V());System.out.println(ac); // 5VSystem.out.println(ac110.outputDC5V(new AC110V())); //电压异常}// 电压输出接口interface AC{String output();}// 110V电压static class AC110V implements AC{@Overridepublic String output() {return "110V";}}// 220V电压static class AC220V implements AC{@Overridepublic String output() {return "220V";}}// 适配器interface Adapter {// 比较 电压与适配器是否匹配boolean support(AC ac);// 转换电压String outputDC5V(AC ac);}// 110V 适配器static class AdapterAC110 implements Adapter{@Overridepublic boolean support(AC ac) {return ac.output().equals("110V");}@Overridepublic String outputDC5V(AC ac) {if (!this.support(ac)){return "电压异常";}return "5V";}}// 220V 适配器static class AdapterAC220 implements Adapter{@Overridepublic boolean support(AC ac) {return ac.output().equals("220V");}@Overridepublic String outputDC5V(AC ac) {if (!this.support(ac)){return "电压异常";}return "5V";}}}
