当前位置: 首页 > news >正文

设计模式-结构型模式-适配器模式

概述

适配器模式 : Adapter Pattern 是一种结构型设计模式.
作用 : 使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
实现思路 : 适配器模式通过将一个类的接口转换成客户希望的另外一个接口来实现这一点。
这里的“接口”指的是类所提供的方法、属性等成员的集合,并非特指面向对象编程语言中的interface。

简单理解 : 适配器模式,就是 中间加一层,把原来的对象包装一下,转换成目标希望的样子。

角色

适配者(Source):需要被适配的类。适配者包含客户想要使用但是接口与目标不兼容的方法。
目标(Target)接口:这是客户所期待的接口。在某些情况下,这个角色可能是一个具体类,而不是接口。
适配器(Adapter):负责将适配者的接口转换为目标接口,从而使原本因为接口不匹配而无法合作的类能够协同工作。

分类

适配器模式分为三类 : 类适配器模式对象适配器模式接口适配器模式

类适配器模式

在不改变原有类结构的情况下,扩展类的功能,以适配不同的接口时,可以使用【类适配器模式】。
实现思路】 : 适配器类 继承 原来的类,并实现目标接口。
实现效果】 : 对原有类的方法,按照 目标接口中的要求进行“包装”,达到适配的效果。

以电源为例,标准的输出电压为220V (适配者),
现在需要给手机/手环 (目标接口)充电,手机要求的电压为 5V,手环要求的电压为 2V ,
此时,就需要 一个充电器(适配器)来进行电压的转换。

类图如下 :

在这里插入图片描述

适配者类

public class Power {
    private int voltage;

    public Power() {
    }

    public Power(int voltage) {
        this.voltage = voltage;
    }
// 这个就是要被适配包装的方法
   public int outPutVoltage() {
       System.out.println("适配者Power 类中 电压 = " + voltage);
       return voltage;
   }
}

目标接口

public interface PhoneCharge {
    int outPutTargetVoltage();
}

适配器类

public class PhoneAdapter extends Power implements PhoneCharge{

    public PhoneAdapter() {
    }

    public PhoneAdapter(int voltage) {
        super(voltage);
    }

// 重写目标接口中的方法 : 核心 : 适配的逻辑就在这里
    @Override
    public int outPutTargetVoltage() {

        // 获取到原来的电压
        int voltageSource = super.outPutVoltage();
        int targetVoltage = voltageSource/44;
        System.out.println("手机适配器中的 电压 = " + targetVoltage);

        return targetVoltage;
    }
}

客户端类

public class Phone {

  // 需要使用到 接口类型
    private PhoneCharge phoneCharge;

    public Phone(PhoneCharge phoneCharge) {
        this.phoneCharge = phoneCharge;
    }

// 使用接口中的目标方法即可
    public void charge() {
        int voltage = phoneCharge.outPutTargetVoltage();
        System.out.println("手机获取到的充电电压 = " + voltage);
    }

}

测试类

public class Client {
    public static void main(String[] args) {
        Phone phone = new Phone(new PhoneAdapter(220));
        phone.charge();
    }
}
运行结果 : 
适配者Power 类中 电压 = 220
手机适配器中的 电压 = 5
手机获取到的充电电压 = 5

对象适配器模式

对象适配器模式 :
1、将 适配者类的对象 作为 适配器类的一个 成员变量
2、适配器类实现 目标接口。
通过 持有适配者类的对象 + 实现目标接口的方式,对原来的逻辑进行扩展。
类图的结构如下:

在这里插入图片描述

适配者类

public class Power {
    private int voltage;

    public Power() {
    }

    public Power(int voltage) {
        this.voltage = voltage;
    }
    
   public int outPutVoltage() {
       System.out.println("适配者Power 类中 电压 = " + voltage);
       return voltage;
   }
}

目标接口

public interface PhoneCharge {
    int outPutTargetVoltage();
}

适配器类

public class PhoneAdapter  implements PhoneCharge{

    // 直接作为成员变量放进来
    private Power power;

    public PhoneAdapter() {
    }

    public PhoneAdapter(Power power) {
        this.power = power;
    }

    @Override
    public int outPutTargetVoltage() {

        // 通过适配者类的对象,获取到原来的电压
        int voltageSource = power.outPutVoltage();
        int targetVoltage = voltageSource/44;
        System.out.println("手机适配器中的 电压 = " + targetVoltage);

        return targetVoltage;
    }
}

客户端类

public class Phone {

    private PhoneCharge phoneCharge;

    public Phone(PhoneCharge phoneCharge) {
        this.phoneCharge = phoneCharge;
    }

    public void charge() {
        int voltage = phoneCharge.outPutTargetVoltage();
        System.out.println("手机获取到的充电电压 = " + voltage);
    }

}

测试类

public class Client {
    public static void main(String[] args) {
        // 创建电源对象,当然这个对象也可以独立使用
        Power power = new Power(220);
        Phone phone = new Phone(new PhoneAdapter(power));
        phone.charge();
    }
}
运行结果 : 
适配者Power 类中 电压 = 220
手机适配器中的 电压 = 5
手机获取到的充电电压 = 5

接口适配器模式

接口适配模式 , 主要应用在 不希望实现所有的接口方法的情况下
1、创建一个抽象类,给接口中的方法一个默认的实现;
2、然后通过继承该抽象类的方式,只重写部分需要的方法,达到简化代码的效果。
类图如下:

在这里插入图片描述

接口

public interface Say {
    void sayHello();
    void sayBye();
    void sayHi();
    void sayHaha();
}

抽象实现类

public class SayAbstractImpl implements Say{
    @Override
    public void sayHello() {}

    @Override
    public void sayBye() {}

    @Override
    public void sayHi() {}

    @Override
    public void sayHaha() {}
}

子类

public class SayHelloAndBye extends SayAbstractImpl{
    @Override
    public void sayHello() {
        System.out.println(" sayHello  : hello ");
    }

    @Override
    public void sayBye() {
        System.out.println(" sayBye : bye ");
    }
}

测试类

public class Test {
    public static void main(String[] args)
    {
        Say say = new SayHelloAndBye();
        say.sayHello();
        say.sayBye();
    }
}
运行结果:
 sayHello  : hello 
 sayBye : bye 

至此,适配器模式的三种使用方式就介绍完成了。

相关文章:

  • 【SpringMVC】深入解析@ RequestMapping 注解的概念及使用和 MVC 介绍
  • 利用可变参数模板,可打印任意参数和参数值。(C++很好的调式函数)
  • Deepseek可以通过多种方式帮助CAD加速工作
  • Docker和DockerCompose基础教程及安装教程
  • dify中使用NL2SQL
  • Java直通车系列15【Spring MVC】(ModelAndView 使用)
  • 计算机视觉|从0到1揭秘Diffusion:图像生成领域的新革命
  • SpreadVue实现内置excel在线编辑并保存为后端可以接受的json格式
  • Centos操作系统大全(附ISO镜像下载)
  • 电商项目-秒杀系统(五) 秒杀下单接口限流
  • 使用Modelsim手动仿真
  • 题目 3217 ⭐成绩统计⭐【滑动窗口 + 二分搜索】蓝桥杯2024年第十五届省赛
  • 大白话 CSS 中transform属性的常见变换类型(平移、旋转、缩放等)及使用场景
  • 管理 SELinux 安全性
  • 正则表达式详解
  • android13打基础: timepicker控件
  • Vue 3 ref(new Map()) 无法触发watch
  • 力扣35.搜索插入位置-二分查找
  • Linux网络配置(超详细)
  • 「Java EE开发指南」如何用MyEclipse构建一个Web项目?(二)
  • 网站建设及推广外包/谷歌推广费用
  • 个人网站设计与开发/美发培训职业学校
  • 有域名后怎么建网站/今晚赛事比分预测
  • 网站竞价开户/网站搭建关键词排名
  • 如何做企业网站规划/seo外包
  • 网站怎么能快速备案/网站关键词优化wang