目录
1、基本定义
2、工作原理
3、类适配器模式
4、对象适配器模式
5、接口适配器模式
1.1、适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原币因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器
1.2、适配器模式属于结构性模式
1.3、主要分为三类:类适配器模式、对象适配器模式、接口适配器模式
2.1、适配器模式:将一个类的接口转换成另一种接口。让原本接口不兼容的类可以兼容
2.2、从用户的角度看不到被适配这,是解耦的
2.3、用户调用适配器转换出来的目标接口发,适配器再调用被适配者的相关接口方法
2.4、用户收到反馈结果,感觉只是和目标接口交换
3.1、基本介绍:Adapter类,通过继承src类,实现dst类接口,完成src->dst的适配
3.2、例子
/**适配的接口
* @author chenbiao
* @Data 2022/10/10 11:40 PM
*/
public interface IVoltage5V {
public int output5V();
}
public class Voltage220V {
public int output220V(){
int src=220;
System.out.println("电压="+src+"符");
return src;
}
}
/**
* 适配器模式就是 要么继承或者实现一个抽象(源) ,再实现 或者继承(目标源)
* @author chenbiao
* @Data 2022/10/10 11:41 PM
*/
public class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int output5V() {
int src = output220V();
int dstV=src/44;
return dstV;
}
}
public class Phone {
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.output5V()==5){
System.out.println("电压为5V,可以充电");
}else if(iVoltage5V.output5V()>5){
System.out.println("电压大于5V,不可以充电");
}
}
}
public class Clinet {
public static void main(String[] args) {
System.out.println("类适配器模式");
Phone phone=new Phone();
phone.charging(new VoltageAdapter());
}
}
3.3、总结:类适配器需要继承目标类 实现转换的类的方法
3.4、特点
1>JAVA是单继承机制,所以类适配器需要继承src类这是一个缺点。因为这要dst必须是接口,有一定局限性。
2>src类的方法在Adapter中都会暴露出来,也增加了类使用的成本
3>由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了
1、基本思路和类的适配器模式相同,只是将Adapter类做修改,不是继承src类。而是持有src类的实例,以解决兼容性的问题。即持有src类,实现dst类的接口完成src->dst的适配
2、根据“合成复用原则”,再系统中尽量使用关联关系来代替继承关系
3、对象适配器模式是适配器模式常用的一种
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("使用对象适配器转换");
int src = voltage220V.output220V();
dst=src/44;
System.out.println("适配完成 输出电压"+dst);
}
return dst;
}
}
public class Clinet {
public static void main(String[] args) {
System.out.println("对象配器模式");
Phone phone=new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
4、总结和类对象基本一致,就是适配器做目标方法的时候改为聚合使用
5.1、当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口中每个放阿飞提供一个默认实现,那么该抽象类的子类可以有选择的覆盖父类的某些方法来实现需求
5.2、适用于一个接口不想使用其所有的方法的情况
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
/**
* 在AbsAdapter 将Interface4的方法进行默认实现
* @author chenbiao
* @Data 2022/10/11 12:17 AM
*/
public class AbsAdapter implements Interface4{
public void m1(){
}
public void m2(){
}
public void m3(){
}
public void m4(){
}
}
public class Clinet {
public static void main(String[] args) {
AbsAdapter adapter = new AbsAdapter() {
@Override
public void m1() {
System.out.println("使用了m1的方法");
super.m1();
}
};
adapter.m1();
}
}
5.3、总结:不直接实现方法,而是抽象类先实现所有的接口方法。客户端通过匿名内部类实现具体自己需要的方法。