二十三种设计模式(第六种)-----适配器模式(Adapter)
尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=11487053970269878470
- 适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)
- 适配器模式属于结构型模式
- 主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
- 三种命名方式:根据src是以什么样的方式给Adapter命名的
类适配器
基本介绍:Adapter类,通过继承src(源)类,实现dst(目标)类接口,完成src->dst的适配。
需求
手机充电,220V电压通过适配器变为5V电压
类图
代码
- 配适配类
public class Voltage220V {
//输出220V电压
public int output220V() {
int src = 220;
System.out.println("电压为:" + src + "伏");
return src;
}
}
- 适配接口
public interface IVoltage5V {
public int output5V();
}
- 适配器
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
//获取到220V电压
int srcV = output220V();
return srcV/44;
}
}
- 手机
public class Phone {
//充电
public void charging(IVoltage5V iVoltage5V) {
if(iVoltage5V.output5V()==5){
System.out.println("电压为5V,可充电...");
}else {
System.out.println("电压不为5V,不可充电...");
}
}
}
- 客户
public class Client {
public static void main(String[] args) {
System.out.println("类适配器");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
对象适配器
- 基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src(源)类,而是持有src类的实例,以解决兼容性的问题。即:持有src类,实现dst类接口,完成src->dst的适配
- 根据"合成复用原则",在系统中尽量使用关联关系来代替继承关系。
- 对象适配器是适配器模式常用的一种
类图
代码
- 适配器类
public class Voltage220V {
//输出220V电压
public int output220V() {
int src = 220;
System.out.println("电压为:" + src + "伏");
return src;
}
}
- 适配器接口
public interface IVoltage5V {
public int output5V();
}
- 适配器
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int output5V() {
int dst = 0;
if (null != voltage220V) {
System.out.println("使用对象适配器,进行适配");
//获取220V电压
int src = voltage220V.output220V();
dst = src / 44;
System.out.println("适配完成,输出的电压为:" + dst);
}
return dst;
}
}
- 手机
public class Phone {
//充电
public void charging(IVoltage5V iVoltage5V) {
if(iVoltage5V.output5V()==5){
System.out.println("电压为5V,可充电...");
}else {
System.out.println("电压不为5V,不可充电...");
}
}
}
- 客户
public class Client {
public static void main(String[] args) {
System.out.println("对象适配器");
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
接口适配器
- 接口适配器模式又叫缺省适配器模式
- 当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择的覆盖父类的某些来实现需求。
- 适用于一个接口不想使用其所有方法的情况。
类图
代码
public interface Interface4 {
void operator01();
void operator02();
void operator03();
void operator04();
}
适配器
public abstract class AbsAdapter implements Interface4 {
@Override
public void operator01() {
}
@Override
public void operator02() {
}
@Override
public void operator03() {
}
@Override
public void operator04() {
}
}
- 客户
public class Client {
public static void main(String[] args) {
//匿名内部类
new AbsAdapter(){
@Override
public void operator01() {
System.out.println("hello");
}
}.operator01();
}
}
适配器在SpringMvc中的HandleAdapter是用到
SpringMvc执行流程
登录->前端控制器(DispatcherServlet执行doDispatcher)->处理器映射器(HandlerMapper)->执行方法(处理器适配器HandlerAdapter)->返回结果->视图解析