• 设计模式大白话——适配器模式



    在这里插入图片描述

    概述

    ​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个“适配器”,我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。

    示例

    ​ 回到编程的世界中,假设我们的某个程序一直依赖一个很久远的接口 OldBusinessInterface,这个时候由于业务需求,需要使用到比较新的接口 NewBusinessInterface,由于历史原因将不对旧的代码进行修改 ,因此目前的方案是将使用 适配器模式 去让 NewBusinessInterface 去适配 OldBusinessInterface

    > 代码在线运行 <

    package main
    
    import "fmt"
    
    // OldBusinessInterface 这是旧的接口
    type OldBusinessInterface interface {
    	OldBusinessMethodA(str string) int
    	OldBusinessMethodB()
    }
    
    // OldBusiness 这是旧的业务类,实现了旧的接口
    type OldBusiness struct {
    }
    
    func (o *OldBusiness) OldBusinessMethodA(str string) int {
    	fmt.Println("OldBusinessMethodA is called")
    	return len(str)
    }
    
    func (o *OldBusiness) OldBusinessMethodB() {
    	fmt.Println("OldBusinessMethodB is called")
    }
    
    // NewBusinessInterface 这是新的接口
    type NewBusinessInterface interface {
    	NewBusinessMethodA(str string) int
    }
    
    // NewBusiness 这是新的业务类,实现了新的接口
    type NewBusiness struct {
    }
    
    func (n *NewBusiness) NewBusinessMethodA(str string) int {
    	fmt.Println("NewBusinessMethodA is called")
    	return len(str)
    }
    
    // OldBusinessMethod 这是旧的业务方法,依赖于旧的接口,但是新的业务类没有实现旧的接口
    func OldBusinessMethod(a OldBusinessInterface) {
    	a.OldBusinessMethodA("hello")
    }
    
    // Adapter 这是适配器,实现了旧的接口,但是依赖于新的接口,这样就可以在旧的业务方法中使用新的业务类了
    type Adapter struct {
    	NewBusinessInterface
    }
    
    func (a *Adapter) OldBusinessMethodA(str string) int {
    	fmt.Println("[Adapter] OldBusinessMethodA is called")
    	return a.NewBusinessMethodA(str)
    }
    
    func (a *Adapter) OldBusinessMethodB() {
    	fmt.Println("[Adapter] OldBusinessMethodB is called")
    }
    
    func main() {
    	// 旧的使用姿势
    	OldBusinessMethod(&OldBusiness{})
    
    	fmt.Println("------------------")
    
    	// 使用适配器,可以在旧的业务方法中使用新的业务类了
    	OldBusinessMethod(&Adapter{&NewBusiness{}})
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    运行结果:

    OldBusinessMethodA is called
    ------------------
    [Adapter] OldBusinessMethodA is called
    NewBusinessMethodA is called
    
    • 1
    • 2
    • 3
    • 4

    ​ 通过适配器,我们能够将 B 接口变成 A 接口,通过这个方式,我们不需要再重新写一个新的实现类,而是只需要增加一个 适配器,这种感觉就是:你现在只有一个安卓充电线,但是你的手机是 Type-C 的接口,这个时候你只需要通过一个 转接线 就可以让 Type-C 接口的手机使用安卓充电线,而不用重新再买一个 Type-C 接口的充电器,这确实能够方便很多,当然,重新买一个充电器也并不是说不可取,这需要结合实际场景考虑各方面的因素来选择最合适的方案。

    适配器的种类

    ​ 实际上,适配器有“两种”:对象适配器类适配器

    • 对象适配器

      在这里插入图片描述

    • 类适配器
      在这里插入图片描述

    ​ 其实本质上只是适配的目标不同而已,我们刚才的代码是针对接口而做的适配,其实就是对象适配器,对于类适配器,其实就是针对类型进行适配(在 Java 中,就是对 Class 进行的适配),使用此方式的前提条件是 编程语言支持多继承(如图,Adapter 继承了目标类和待适配的类)。

    小结

    • 模式定义

      将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

    ​ 总结以上的内容,说白了,适配器其实就是一个中间层,可以让原本不兼容的接口转换成目标接口,最核心的是 “转换” 二字。如果你了解过外观模式和装饰模式,你可能会对他们三个感到有些困惑,分不清他们的差异,不用担心,我在之后的文章会对他们三个的差异做出解释。

    ​ 以上便是本篇的全部内容了,如果内容存在又问题的地方欢迎指点。

  • 相关阅读:
    网页制作课作业基于HTML+CSS+JavaScript+jquery仿慕课网教学培训网站设计实例 企业网站制作
    代理和负载均衡
    Keras学习记录之模型编译-训练-评估-预测
    2020年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
    mac解决//go:linkname must refer to declared function or variable
    ORACLE在系统级别修改PDB
    [Java Framework] [Spring] Spring Event / 事件的使用 一: ApplicationEvent
    贪心,排序不等式:acwing第133场周赛:最小和
    机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python 计算机竞赛
    GET 和 POST 请求类型的区别
  • 原文地址:https://blog.csdn.net/weixin_44829930/article/details/132596537