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

设计模式-08-适配器模式

       经典的设计模式有23种,但是常用的设计模式一般情况下不会到一半,我们就针对一些常用的设计模式进行一些详细的讲解和分析,方便大家更加容易理解和使用设计模式。

1-适配器模式原理

       适配器模式的英文翻译是Adapter Design Pattern。顾名思义,这个模式就是用来做适配的,它将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作。适配器模式有两种实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

2-适配器模式demo实现

// 类适配器: 基于继承
public interface ITarget {void f1();void f2();void fc();
}public class Adaptee {public void fa() { //... }public void fb() { //... }public void fc() { //... }
}public class Adaptor extends Adaptee implements ITarget {public void f1() {super.fa();}public void f2() {//...重新实现f2()...}// 这里fc()不需要实现,直接继承自Adaptee,这是跟对象适配器最大的不同点
}// 对象适配器:基于组合
public interface ITarget {void f1();void f2();void fc();
}public class Adaptee {public void fa() { //... }public void fb() { //... }public void fc() { //... }
}public class Adaptor implements ITarget {private Adaptee adaptee;public Adaptor(Adaptee adaptee) {this.adaptee = adaptee;}public void f1() {adaptee.fa(); //委托给Adaptee}public void f2() {//...重新实现f2()...}public void fc() {adaptee.fc();}
}

       针对这两种实现方式,在实际的开发中,到底该如何选择使用哪一种呢?判断的标准主要有两个,一个是Adaptee接口的个数,另一个是Adaptee和ITarget的契合程度。

    (1)如果Adaptee接口并不多,那两种实现方式都可以。
    (2)如果Adaptee接口很多,而且Adaptee和ITarget接口定义大部分都相同,那我们推荐使用类适配器,因为Adaptor复用父类Adaptee的接口,比起对象适配器的实现方式,Adaptor的代码量要少一些。
   (3)如果Adaptee接口很多,而且Adaptee和ITarget接口定义大部分都不相同,那我们推荐使用对象适配器,因为组合结构相对于继承更加灵活。

3-适用场景

        一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无奈之举”。如果在设计初期,我们就能协调规避接口不兼容的问题,那这种模式就没有应用的机会了。一般会有以下几种场景会使用:

(1)封装有缺陷的接口设计
(2)统一多个类的接口设计
(3)替换依赖的外部系统
(4)兼容老版本接口
(5)适配不同格式的数据

4-对比区别

       代理、桥接、装饰器、适配器,这4种模式是比较常用的结构型设计模式。它们的代码结构非常相似。笼统来说,它们都可以称为Wrapper模式,也就是通过Wrapper类二次封装原始类。

尽管代码结构相似,但这4种设计模式的用意完全不同,也就是说要解决的问题、应用场景不同,这也是它们的主要区别。这里我就简单说一下它们之间的区别。

代理模式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。

桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变。

装饰器模式:装饰者模式在不改变原始类接口的情况下,对原始类功能进行增强,并且支持多个装饰器的嵌套使用。

适配器模式:适配器模式是一种事后的补救策略。适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口。

http://www.lryc.cn/news/232279.html

相关文章:

  • 北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374
  • 【Android】带下划线的TextView
  • 图解未来:数据可视化引领智慧决策时代
  • 例解什么是Python装饰器
  • EtherCAT从站EEPROM组成信息详解(3):字16-63邮箱、EEPROM信息
  • 【文件读取/包含】任意文件读取漏洞 afr_1
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • 通义灵码,阿里巴巴的编程辅助工具
  • Uniapp导出的iOS应用上架详解
  • 计算机视觉基础(7)——相机基础
  • 解决Github上的README无法显示图片
  • qnx 工程目录创建工具 addvariant
  • 计算机视觉+深度学习+机器学习+opencv+目标检测跟踪+一站式学习(代码+视频+PPT)
  • 【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023
  • 深度学习:多模态与跨模态
  • 大数据Hadoop之——部署hadoop+hive+Mysql环境(Linux)
  • Python与ArcGIS系列(四)在地图文档中加入图层
  • QT 程序异常崩溃
  • Ubuntu20.04 通过nmcli命令查看网卡状态为unmanaged
  • 【R Error系列】r - fatal error : RcppEigen. h:没有这样的文件或目录
  • 如何在聊天记录中实时查找大量的微信群二维码
  • 03-CSS基础选择器
  • 【ROS】RViz2源码分析(二):main函数及编译配置详解
  • Vue.js的生命周期钩子
  • 第3章:搜索与图论【AcWing】
  • C++ Qt 学习(七):Qt 线程与并发
  • Django框架之模板层
  • 【AI视野·今日Robot 机器人论文速览 第六十五期】Mon, 30 Oct 2023
  • LuatOS-SOC接口文档(air780E)--otp - OTP操作库
  • 为什么LDO一般不用在大电流场景?