1、适配器的角色
1)目标(Target):使用的特定接口。
2)被适配者(Adaptee):一个现存需要适配的接口。
3)适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心。
2、类适配器
类图
代码
适配器类
/**
* 电压适配器
*/
public class VoltageAdapter extends Voltage220V implements IVoltage110V {
@Override
public int output110V() {
int v = output220V();
System.out.println("============类适配器==============");
System.out.println("电压="+v);
System.out.println("电压转换中");
v = v/2;//转为110v
System.out.println("电压转换完毕,电压为"+v);
System.out.println("============类适配器==============");
return v;
}
}
需要适配的接口
/**
* 110v的电压接口
*/
public interface IVoltage110V {
public int output110V();
}
需要被适配的对象
/**
* 输出220v电压
*/
public class Voltage220V {
public int output220V(){
int src = 220;
return src;
}
}
调用适配接口的对象
/**
* 我的设备只能接受110v的电压
*/
public class MyPC {
public void charging(IVoltage110V iVoltage110V){
if (iVoltage110V.output110V() == 110){
System.out.println("充电中");
}else{
System.out.println("不能充电");
}
}
}
运行代码
public class AdapterTest {
public static void main(String[] args) {
MyPC myPC = new MyPC();
//通过电源适配器将电压转为110V
myPC.charging(new VoltageAdapter());
}
}
运行效果
类适配器的缺点
1)java是单继承机制,一个类只能继承一个对象,通过继承adaptee并且实现target方法,是静态的方式。
2)它会将adaptee的方法都在适配器中暴露出来
解决以上的缺陷则选用对象适配器
3、对象适配器
类图
代码
适配器类
/**
* 电压适配器
* 对象适配器使用了合成服用原则的思想将要适配的对象实例化后进行适配大大增加了适配器的灵活性
*/
public class VoltageAdapter implements IVoltage110V {
Voltage220V voltage220V = null;
//通过构造器传入要适配的一个类型的实例
public VoltageAdapter(Voltage220V voltage220V){
this.voltage220V = voltage220V;
}
@Override
public int output110V() {
int v = voltage220V.output220V();
System.out.println("============对象适配器==============");
System.out.println("电压="+v);
System.out.println("电压转换中");
v = 110;//转为110v
System.out.println("电压转换完毕,电压为"+v);
System.out.println("============对象适配器==============");
return v;
}
}
运行代码
public class AdapterTest {
public static void main(String[] args) {
MyPC myPC = new MyPC();
Voltage220V voltage220V = new Voltage220V();
//通过电源适配器将电压转为110V
myPC.charging(new VoltageAdapter(voltage220V));
}
}
运行结果
相较于类适配器
1、基本与类适配器相似,通过“合成复用原则”修改了adapter,不是在继承adaptee而是持有了adaptee的实例对象,解决了类适配器的缺陷
4、接口适配器
类图
代码
适配器
/**
* 接口适配器
* 当不想实现接口的全部方法时可以使用接口适配器来进行默认的实现
*/
public abstract class MyAdapter implements MyInterface{
@Override
public void method01() {
}
@Override
public void method02() {
}
@Override
public void method03() {
}
@Override
public void method04() {
}
}
被适配接口
/**
* 被适配的接口
*/
public interface MyInterface {
public void method01();
public void method02();
public void method03();
public void method04();
}
运行代码
public class AdapterTest {
public static void main(String[] args) {
//只想使用method01方法就通过适配器重写method01方法即可使用
MyInterface myAdapter = new MyAdapter() {
@Override
public void method01() {
System.out.println("我就想使用method01方法");
}
};
myAdapter.method01();
}
}
运行效果
适用环境
适合使用在不需要实现该接口所有方法的情况下只需通过适配器实现自己所需要使用的方法即可。