• 适配器模式(Adapter Pattern)


    适配器模式(Adapter Pattern)

    定义

    它的功能是将一个类的接口变成客户端锁期望的另一种接口,从而使原本因接口不匹配而导致无法在一起工作的两个类能够一起工作。

    属于结构型设计模式

    适用场景

    已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
    适配器模式不是软件设计阶段考虑的设计模式。它是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。类似于后期的补丁方案。

    适配器主要是为了解决兼容问题。

    类适配器用的是继承;对象适配器用的是组合。

    标准示例

    一 类适配器

    在这里插入图片描述
    类适配器,有三个角色:
    目标接口(Target)、适配者(Adapter)、类适配器(ClassAdapter
    具体代码如下:

    public interface Target{
    	void request();
    }
    
    public class Adapter{
    	public void specificRequest(){
    		System.out.println("适配器中的业务代码");
    	}
    }
    
    public class ClassAdapter extends Adapter implements Target{
    	public void request(){
    		super.specificRequest();
    	}
    }
    
    public class ClientTest{
    	public static void main(String[] args){
    		Target target = new ClassAdapter();
    		target.request();
    	}
    }
    

    执行结果输出为:

    适配器中的业务代码
    

    二 对象适配器

    在这里插入图片描述
    对象适配器,也有三个角色:
    目标接口(Target)、适配者(Adapter)、类适配器(ObjectAdapter
    前两者与类适配器中相同。
    实际上,类适配器与对象适配器的区别,主要在于:
    前者是通过继承体系获取父类Adapter 中的方法;
    后者是通过构造方法传入Adapter对象实例,调用Adapter中的方法
    相同的类不再重复,下面给出ObjectAdapter 和 ClientTest

    public class ObjectAdapter implements Target{
    	private Adapter adapter;
    	public ObjectAdapter(Adapter adapter){
    		this.adapter = adapter;
    	}
    	public void request() {
            adapter.specificRequest();
        }	
    }
    
    public class ClientTest{
    	public static void main(String[] args){
    		Target target = new ObjectAdapter(new Adapter());
    		target.request();
    	}
    }
    

    输出结果为:

    适配器中的业务代码
    

    ClassAdapter类,通过继承 Adapter类,实现 Target 接口,完成 Adapter -> Target 的适配


    接下来举个常见的例子。
    日常生活中,常见的是220V的交流电,而我们电子设备上不需要这么大的电压,所以使用适配器将其转换为5V的电压。
    我们以类适配器为例:
    被适配的类:Voltage220V
    适配接口:IVoltage5V
    适配器类:VoltageAdapter
    用电器:Phone

    public class Voltage220V{
    	public int out220V(){
    		System.out.println("电压220V");
    		return 220;
    	}
    }
    
    public interface IVoltage5V{
    	int out5V();	
    }
    
    public class VoltageAdapter extends Voltage220V implements IVoltage5V{
    	public int out5V(){
    		int srcOut = super.out220V();
    		int targetOut = srcOut / 44;
    		return targetOut;
    	}
    }
    
    public class Phone(){
    	public void charge(IVoltage5V voltage){
    		int out = voltage.out5V();
    		if(out == 5){
    			System.out.println("电压是5v,可以充电");	
    		}else{			
    			System.out.println("电压不是5v,无法充电");	
    		}
    	}
    }
    
    public class ClientTest{
    	public static void main(String[] args){
    		IVoltage5V voltage = new VoltageAdapter();
    		Phone phone = new Phone();
    		phone.charge(voltage);
    	}
    }
    

    执行后,输出结果为:

    电压220V
    电压是5v,可以充电
    

    以上就是适配器模式的全部内容,感谢阅读。

  • 相关阅读:
    Windows下搭建nginx和rtspToWebRTC以及Windows程序添加为服务开机启动和后台运行
    React + TypeScript 组件的状态和构造 React Hooks
    mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决
    想做扫码看图效果,你需要学会这一招
    (一)RabbitMQ实战——rabbitmq的核心组件及其工作原理介绍
    Jmeter系列-测试计划详细介绍(3)
    小程序 英语学习小助手java
    linux中查看MySQL数据库表数据及结构并导入sql脚本
    Operations for Algorithms
    (Java)Mybatis学习笔记(三)
  • 原文地址:https://blog.csdn.net/yuiezt/article/details/140019104