设计模式之适配器模式
-
适配器模式基本介绍
-
基本介绍
-
适配器模式(Adapter Pattern)将某个类 接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能在一起工作的两个类可以协同工作。其别名为包装器
-
适配器模式属于结构型模式
-
主要分为3类:类适配器模式、对象适配器模式、接口适配器模式
-
-
适配器模式工作原理
-
适配器模式:将一个类非接口转化成另一个接口。让原本接口不兼容的类可以兼容
-
从用户的角度看不到被适配者,是解耦的
-
用户调用适配器转化出来的目标接口方法,适配器在调用被适配者的相关接口方法
-
用户收到反馈结果,感觉只是和目标接口交互,并不会感觉到中间有适配器
-
-
类适配器
-
基本介绍
-
Adapter类,通过继承src类,实现dst类,完成src->dst的适配
-
-
类适配器应用案例
-
生活中的充电器为例,充电器本身相当于Adapter,220交流电相当于src(即被适配者),目标dst是5V直流电
-
-
代码
//编写被适配者
public class Voltage220V{
//输出220V电压
public int output220V(){
int src = 220;
System.out.println("电压="+src+"V");
return src;
}
}
//编写一个接口,有一个输出5V的抽象方法
public interface IVoltage5V{
public abstract int output5V();
}
//编写一个类,作用可以将220V电压转换成5V
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V(){
//先拿到220V电压
int srcV=output220V();
int dst = srcV / 44;
return dst;
}
}
//编写一个手机类,给手机充电
public class Phone{
//充电方法
public void charming(IVoltage5V iVoltage5V){
if(iVoltage5V.ouotput5V == 5){
System.out.println("电压正常可以正常充电")
}
}
}
//编写一个客户端
public class Client{
public static void main(String[] args){
Phone phone = new Phone();
phone.charming(new VoltageAdapter());
}
} -
类适配器类图
-
类适配器的注意事项和细节
-
java是单继承机制,所以类适配器需要继承src类这个算是一个缺点,因为这就要求dst必须是一个接口,有一定的局限性
-
src的方法在adapter中都会暴露出来,也增加了使用成本
-
由于其继承了src类,所以他可以根据需求重写src方法,使得adapter的灵活性增强了
-
-
-
对象适配器模式
-
基本介绍
-
基本思路和类的适配器模式基本相同,只是将adapter类做修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即:持有src类,实现dst接口,完成src--->dst的适配
-
根据合成复用原则,在系统中尽量使用关联关系来代替继承关系
-
对象适配器模式是适配器模式中常用的一种
-
-
通过对象适配器改进类适配器中的案例代码
//编写被适配者
public class Voltage220V{
//输出220V电压
public int output220V(){
int src = 220;
System.out.println("电压="+src+"V");
return src;
}
}
//编写一个接口,有一个输出5V的抽象方法
public interface IVoltage5V{
public abstract int output5V();
}
//编写一个类,作用可以将220V电压转换成5V
public class VoltageAdapter implements IVoltage5V{
private Voltage220V voltage220V;//聚合
//创建一个构造器
public VoltageAdapter(Voltage220V voltage220V){
super();
this.voltage220V=voltage220V;
}
@Override
public int output5V(){
int dst = 0;
if(null != voltage220V){
int src = voltage220V.output220V();
dst = src / 44;
System.oout.println("适配后的电压="+dst)
}
return dst;
}
}
//编写一个手机类,给手机充电
public class Phone{
//充电方法
public void charming(IVoltage5V iVoltage5V){
if(iVoltage5V.ouotput5V == 5){
System.out.println("电压正常可以正常充电")
}
}
}
//编写一个客户端
public class Client{
public static void main(String[] args){
Phone phone = new Phone();
phone.charming(new VoltageAdapter(new Voltage220V()));
}
} -
接口适配器模式类图
-
对象适配器模式注意事项和细节
-
对象适配器和;类适配器其实是同一种思想,只是实现方式不同而已,根据合成复用原则,使用组合代替继承,所以他解决了类适配器必须继承src的局限性问题,也不再要求dst必须是接口
-
使用成本更低,更加灵活
-
-
-
接口适配器模式
-
基本介绍
-
一些书籍中称为:适配器模式或者缺省适配器模式
-
当不需要全部实现接口提供的方法时,可以设计一个抽闲类实现接口,并为该接口中的每一个方法提供一个默认实现(空方法),那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求
-
使用于一个接口不想使用其所有方法的情况
-
-
适配器模式在SpringMVC框架应用的解析
-
SpringMVC中HandleAdapter,就使用了适配器模式
-
-
-
适配器模式注意事项和细节
-
三种命名方式,是根据src是以怎样的形式给到Adapter来命名的
-
详解
-
类适配器:以类给到,在Adapter里,就是将src当做类。继承
-
对象适配器:以对象给到,在Adapter里,将Src作为对象,持有
-
接口适配器:以接口给到,在Adapter里,将src作为一个接口,实现
-
-
Adapter最大的作用还是将原本不兼容的接口融合在一起工作
-
在实际开发,并不局限上面说的三种方式
-
-
-