一、介绍
适配器模式解决了因接口不匹配而不能一起工作的两个类如何协同工作的问题,主要是解决类或接口的兼容性问题,又称为包装器Wrapper。
适配器模式属于结构型模式,主要分为类适配器模式、对象适配器模式和接口适配器模式三类。
二、实现
1)类适配器
/**
* @Note {适配接口}
* @author giserDev
* @Date 2020-05-21 23:33:19
*/
public interface IVoltage5V {
int output5V();
}
/**
* @Note {被适配的类}
* @author giserDev
* @Date 2020-05-21 23:33:57
*/
public class Voltage220V {
public int output220V() {
return 220;
}
}
/**
* @Note {类适配器}
* @author giserDev
* @Date 2020-05-21 23:35:34
*/
public class VoltageAdapter extends Voltage220V
implements IVoltage5V {
@Override
public int output5V() {
int srcV = output220V();
int dstV = srcV / 44; // 进行适配处理
return dstV;
}
}
测试:
public class Phone {
public void charging(IVoltage5V voltage5V) {
if (null == voltage5V) {
System.out.println("error");
} else {
System.out.println("5V, start charging...");
}
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
补充:
类适配器需要继承被适配的类,但java是单继承机制,这就要求适配的必须是接口。
2)对象适配器
/**
* @Note {对象适配器}
* @author giserDev
* @Date 2020-05-21 23:35:34
*/
public class VoltageAdapter implements IVoltage5V {
/**
* 持有被适配的类对象
*/
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220v) {
voltage220V = voltage220v;
}
@Override
public int output5V() {
int dstV = 0;
if (null != voltage220V) {
int srcV = voltage220V.output220V();
dstV = srcV / 44; // 进行适配处理
}
return dstV;
}
}
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
补充:
根据合成复用原则,对象适配器使用组合替代继承,解决了类适配器必须继承被适配对象的局限,也不要求目标对象必须是接口。
3)接口适配器
核心思想是设计一个抽象类实现接口,并为接口中的每个方法提供一个默认实现,可以是空实现,这样抽象类的子类可以有选择的覆盖父类的某些方法,不需要全部实现接口提供的方法。
适用于一个接口不想使用其所有方法的情况。
package com.giser.designpattern.adapter.interfaceadapter;
public interface IGiserDev {
void play();
void run();
void sleep();
void dance();
}
package com.giser.designpattern.adapter.interfaceadapter;
/**
* @Note {抽象类,为接口的方法提供了默认实现}
* @author giserDev
* @Date 2020-05-22 00:03:17
*/
public abstract class GiserDevAdapter implements IGiserDev {
@Override
public void play() {}
@Override
public void run() {}
@Override
public void sleep() {}
@Override
public void dance() {}
}
package com.giser.designpattern.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
GiserDevAdapter devAdapter = new GiserDevAdapter() {
/**
* 只需重写需要覆盖的方法即可
*/
@Override
public void play() {
System.out.println("giser play");
}
};
devAdapter.play();
}
}
三、总结
根据被适配的类在适配器中的存在形式不同而命名,共三种:
以类的形式存在于适配器中,则称为类适配器;
以对象的形式组合到适配器中,则称为对象适配器;
以接口的形式存在,则称为接口适配器。
适配器模式最大的作用在于将原本不兼容的接口融合在一起工作。
在SpringMVC中的HandlerAdapter中就是用了适配器模式。