基本介绍:
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作,也可以叫做包装器模式
适配器模式是属于结构型模式
其主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
工作原理:
将一个类的接口转换成另一种接口,让原本不兼容的类可以兼容
从用户的角度看不到被适配者,是解耦的
用户调用适配器转换出来的目标接口方法,适配器再调用被适配者的相关接口方法,用户收到反馈,感觉只是和目标接口交互
现在有一个案例是给手机充电,正常电压220V,手机不能直接使用,这时就可以使用一个适配器来处理电压到5V,下面使用类适配器来实现
类适配器
首先是输出220V电压的类
public class Voltage220 { //输出220伏的电压 public Integer output220V(){ int src = 220; System.out.println("电压是"+src+"V"); return src; } }
然后需要有一个适配器接口,让适配器类去继承被适配类 实现适配器接口
public interface IVoltage5 { Integer output5V(); } public class Voltage5 extends Voltage220 implements IVoltage5{ @Override public Integer output5V() { //处理电压到5V int src = output220V(); int dst = src / 44; return dst; } }
手机类充电
public class Phone { public void charging(IVoltage5 iVoltage5){ if(iVoltage5.output5V() == 5){ System.out.println("电压是5V 可以充电"); }else if(iVoltage5.output5V() > 5){ System.out.println("电压过高 不能充电"); } } }
测试类
public class Client { public static void main(String[] args) { Phone phone = new Phone(); phone.charging(new Voltage5()); } }
可以看到本来是220V的电压通过适配器处理到5V可以充电
这是使用的类适配器,类适配器需要注意几点
1,java是单继承机制,所以适配器只能实现适配器接口而不能同时技能被适配类和适配器父类
2,被适配类的方法在适配器类中会暴露出来,增加了使用成本
3,因为继承了被适配类,所以可以根据需求重新被适配类的方法,更加灵活
对象适配器
对象适配器的基本思路和类适配器相同,只是将适配器类稍作修改,不再继承被适配类,而是持有被适配类的实例,即聚合或组合被适配类,以解决兼容性问题
根据 合成复用原则 ,尽量使用关联关系来替代继承关系
对象适配器是适配器模式最常用的一种
案例使用对象适配器改进
适配器接口、手机类和被适配类都不需要改变
适配器类不在继承被适配类,而是通过构造方法聚合被适配类
public class Voltage5 implements IVoltage5 { private Voltage220 voltage220; public Voltage5(Voltage220 voltage220){ this.voltage220 = voltage220; } @Override public Integer output5V() { //处理电压到5V int src = voltage220.output220V(); int dst = src / 44; return dst; } }
测试使用
public class Client { public static void main(String[] args) { Phone phone = new Phone(); phone.charging(new Voltage5(new Voltage220())); } }
输出结果还是一样的
接口适配器模式
也可以叫做缺省适配器模式
当不需要全部实现接口提供的方法时,可以设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),这样一来该抽象类的子类就可以有选择的覆盖父类的某些方法来实现需求,适用于一个接口不想使用其所有方法的情况
假如现在适配器接口里面有多个方法需要实现,而我们的适配器类有只用到了一个方法,这时可以新建一个抽象类去实现适配器接口,然后实现所有方法,这样一来我们在使用的时候就可以使用匿名内部类的方式,new 一个抽象类然后实现需要的方法即可
在springMvc中处理请求的时候使用到了适配器模式,spring创建了一个HandlerAdapter接口,它的实现子类中每一种Controller有与之对应的适配器实现类