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

设计模式(五)结构型模式---适配器模式

文章目录

  • 适配器模式简介
  • 结构
  • 适配器分类
  • 类适配器(class adapter)
    • 具体实现
      • UML图
      • 代码实现
    • 缺点
  • 接口适配器(interface adapter)
    • 具体实现
      • UML图
      • 代码实现
  • 对象适配器(object adapter)
    • 具体实现
      • UML图
      • 代码实现

适配器模式简介

适配器模式是将一个类的接口转换成客户希望的另外一个接口,使得原来由于接口不兼容而不能一起工作的,而能一起工作。

结构

  • 1.目标接口(Target):当前系统所期待的接口,它可以是抽象类或者接口。
  • 2.适配者类(Adaptee):它是被访问和适配的现存组件库中的组件接口。
  • 3.适配器类(Adapter):转换器,通过继承或者引用适配者的对象,把适配折接口转换城目标接口,让客户目标接口的格式访问适配者。

适配器分类

适配器根据适配对象不同,分为:类适配器、接口适配器、对象适配器。

类适配器(class adapter)

类适配器中的目标对象(Target)是一个接口,被适配者类(Adaptee)需要实现或者继承目标对象接口和被适配者的类。

具体实现

例子:将220V的电压转到5V。

UML图

在这里插入图片描述

代码实现

  • 5V电压接口(目标接口)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 5V电压接口,目标接口 - target* @date 2024/5/24 23:56*/
public interface IVoltage5V {public int output5V();
}
  • 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 现存适配者类* @date 2024/5/25 0:01*/
public class Voltage220V {/*** @description  输出220V* @author  xxliao* @date  2024/5/25 0:04*/public int output220V() {System.out.println("电压="+220+"V");return 220;}
}
  • 适配器类
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 适配器类** @date 2024/5/25 0:04*/
public class Adapter extends Voltage220V implements IVoltage5V{@Overridepublic int output5V() {int src = output220V();int dest = src / 44;System.out.println(src+"v ==> "+dest+"V");return dest;}
}
  • 测试客户端
package com.xxliao.pattern.structure.adapter.class_adapter.demo;/*** @author xxliao* @description: 类适配器测试客户端类* @date 2024/5/25 0:06*/
public class Client {public static void main(String[] args) {Adapter adapter = new Adapter();adapter.output5V();}
}
  • 测试结果
    在这里插入图片描述

缺点

  • 缺点:适配器类(Adapter)需要继承被适配器类(Adaptee)违背了 里氏替换原则。

接口适配器(interface adapter)

  • 当不需要全部实现接口提供的方法时,可先设计一个适配器抽象类实现接口,并为该接口中每个方法提供一个默认实现(空实现),那么适配器的子类可以选择性地覆盖父类地方法。
  • 使用一个接口不想使用其所有方法的情况。

具体实现

UML图

在这里插入图片描述

代码实现

  • 测试接口
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 测试接口* @date 2024/5/25 0:23*/
public interface TestInterface {public void method01();public void method02();public void method03();public void method04();}
  • 适配器抽象类
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 适配器抽象类* @date 2024/5/25 0:25*/
public abstract class AbstractAdapter implements TestInterface{@Overridepublic void method01() {}@Overridepublic void method02() {}@Overridepublic void method03() {}@Overridepublic void method04() {}
}
  • 测试客户端
package com.xxliao.pattern.structure.adapter.interface_adapter.demo;/*** @author xxliao* @description: 接口适配器 测试客户端 测试类* @date 2024/5/25 0:26*/
public class Client {public static void main(String[] args) {AbstractAdapter abstractAdapter = new AbstractAdapter(){@Overridepublic void method01() {super.method01();System.out.println("执行了method01方法..."); // 抽象适配器子类}};abstractAdapter.method01();}
}
  • 测试结果:
    在这里插入图片描述

对象适配器(object adapter)

  • 因为类适配器的适配器类需要继承被适配者类违背了里斯替换原则,所以可以采用合成复用原则 ,将被适配者类当作成员变量进行组合使用。

具体实现

UML图

在这里插入图片描述

代码实现

  • 5V接口(目标接口)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;/*** @author xxliao* @description: 5V接口 - 目标接口* @date 2024/5/24 23:56*/
public interface IVoltage5V {public int output5V();}
  • 220V类(适配者类)
package com.xxliao.pattern.structure.adapter.object_adapter.demo;/*** @author xxliao* @description: 现存适配者类* @date 2024/5/25 0:01*/
public class Voltage220V {/*** @description  输出220V* @author  xxliao* @date  2024/5/25 0:04*/public int output220V() {System.out.println("电压="+220+"V");return 220;}
}
  • 适配器类
package com.xxliao.pattern.structure.adapter.object_adapter.demo;import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;/*** @author xxliao* @description: 适配器类* @date 2024/5/25 0:04*/
public class Adapter implements IVoltage5V {private Voltage220V voltage220V;public Adapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {int src = voltage220V.output220V();int dest = src / 44;System.out.println(src+"v ==> "+dest+"V");return dest;}
}
  • 测试客户端
package com.xxliao.pattern.structure.adapter.object_adapter.demo;import com.xxliao.pattern.structure.adapter.class_adapter.demo.Voltage220V;/*** @author xxliao* @description: 对象适配器 测试客户端 测试类* @date 2024/5/25 0:06*/
public class Client {public static void main(String[] args) {Voltage220V voltage220V = new Voltage220V();Adapter adapter = new Adapter(voltage220V);adapter.output5V();}
}
  • 测试结果
    在这里插入图片描述

相关文章:

  • Unity DOTS技术(三)JobSystem+Burst+批处理
  • Web前端框架:深入探索与实践
  • 51单片机串口通信实现餐厅叫号
  • 数论1---整除
  • paddleocr快速入门:基于python脚本及命令行两种方式实现图片OCR识别
  • Qt 自定义代理类
  • ubuntu下搭建Supervisor
  • prometheus-alert使用
  • 达梦8 内存泄漏泄漏原因分析之一
  • IDM的优势
  • 安卓手机APP开发____持久性工作
  • TimeDao-一篇文章了解清楚Subspace项目
  • ssm324基于javaweb的企业人事信息管理系统+jsp-手把手调试搭建
  • HCIP-Datacom-ARST自选题库__MAC【14道题】
  • Git 恢复已删除的branch
  • [ JavaScript ] 数据结构与算法 —— 链表
  • Android组件 - 收藏集 - 掘金
  • EOS是什么
  • Flex布局到底解决了什么问题
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java反射-动态类加载和重新加载
  • JDK 6和JDK 7中的substring()方法
  • python 装饰器(一)
  • Python学习之路16-使用API
  • React系列之 Redux 架构模式
  • React中的“虫洞”——Context
  • Shadow DOM 内部构造及如何构建独立组件
  • SQLServer插入数据
  • vue2.0项目引入element-ui
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • windows下mongoDB的环境配置
  • 订阅Forge Viewer所有的事件
  • 关于List、List?、ListObject的区别
  • 你真的知道 == 和 equals 的区别吗?
  • 前端存储 - localStorage
  • 使用权重正则化较少模型过拟合
  • 算法系列——算法入门之递归分而治之思想的实现
  • 听说你叫Java(二)–Servlet请求
  • postgresql行列转换函数
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • # 数据结构
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (六)Hibernate的二级缓存
  • (三) diretfbrc详解
  • (三)docker:Dockerfile构建容器运行jar包
  • (十三)MipMap
  • (十五)、把自己的镜像推送到 DockerHub
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)ORM
  • (转)母版页和相对路径
  • .helper勒索病毒的最新威胁:如何恢复您的数据?