定义
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
类适配器模式
需求
给手机充电时,需要用5v的电压,而我们生活用电时220v的。如果直接用220v电压给手机充电,估计手机一下子就爆炸了,所以需要电源适配器将220v电压转换成5v电压。
创建适配者类:22V电压类
package com.hupp.adapter.classadapter;
public class Voltage220V {
public int output220v(){
int source = 220;
System.out.println("电压="+source+"伏");
return source;
}
}
创建目标接口:5V电压接口
package com.hupp.adapter.classadapter;
public interface IVoltage5V {
int output5v();
}
创建适配器:将220v转换成5v
package com.hupp.adapter.classadapter;
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5v() {
int source = output220v();
int dst = source/44;
return dst;
}
}
创建手机类,给手机充电
package com.hupp.adapter.classadapter;
public class Phone {
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.output5v()==5){
System.out.println("电压5V,可以充电");
}
else if(iVoltage5V.output5v()>5){
System.out.println("电压过高,不能充电");
}
}
}
创建客户端类,调用手机充电方法
package com.hupp.adapter.classadapter;
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
输出结果
对象适配器
对象适配器代码和类适配器非常相似,区别就是将类适配器中的继承关系改成聚合关系,对于类继承器的代码只需改动适配器就行了。因为没有继承关系了,那么适配器和适配者的耦合度就降低了。
修改后的适配器代码
package com.hupp.adapter.objadapter;
public class VoltageAdapter implements IVoltage5V {
//通过构造函数传入
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
private Voltage220V voltage220V;
@Override
public int output5v() {
int dst = 0;
if(null!=voltage220V){
int source = voltage220V.output220v();
dst = source/44;
}
return dst;
}
}
客户端调用
package com.hupp.adapter.objadapter;
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
执行结果
接口适配器模式 / 缺省设计模式
当不需要全部实现接口提供的方法时,可以设计一个抽象类实现接口,并为该接口中每一个方法提供一个默认实现(空方法),那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求
适用于一个接口实现类不需要使用接口提供的所有方法的情况。
代码演示
接口
package com.hupp.adapter.interfaceadapter;
public interface MyInterface {
void method1();
void method2();
void method3();
}
适配器,实现接口
package com.hupp.adapter.interfaceadapter;
public abstract class AbsAdapter implements MyInterface{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
客户端,匿名了重写需要的方法
package com.hupp.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter adapter = new AbsAdapter() {
@Override
public void method1() {
System.out.println("使用了method1方法");
}
};
adapter.method1();
}
}
输出结果