python 设计模式-适配器模式

栏目: Python · 发布时间: 5年前

内容简介:美国标准的插头:electric_plug:无法在欧洲标准的插座上使用,通常的做法是什么呢?添加一个插头适配器,适配器的作用是将欧式插头转换成美式插座,以便于让美式插头可以使用。

问题 :假设有一个软件系统,你希望它能在不改变现有代码的前提下和一个新的厂商类库搭配使用,但是这个新厂商所设计出来的接口不同于旧厂商的接口

python 设计模式-适配器模式

这个问题和下图的问题类似

python 设计模式-适配器模式

美国标准的插头:electric_plug:无法在欧洲标准的插座上使用,通常的做法是什么呢?

添加一个插头适配器,适配器的作用是将欧式插头转换成美式插座,以便于让美式插头可以使用。

解决方案

所以,面对一个有全新接口的类库而又不能改变现有代码时,最先想到的做法是,在这两个系统之间添加一个适配器。

python 设计模式-适配器模式

简单的例子

有一个系统,需要一个鸭子 对象,但是现在只有一个火鸡 对象。鸭子和火鸡对象的功能简单描述如下:

# 鸭子的简单描述
class Duck:
    def quack(self):
        # 会呱呱叫
        print("Quack")
    
    def fly(self):
        # 飞的能力
        print("I'm flying")
        
# 火鸡的简单描述
class Turkey:
    def gobble(self):
        # 不会呱呱叫,只会咯咯叫
        print("Gobble gobble")
    
    def fly(self):
        # 飞的能力 但是飞不远
        print("I'm flying a short distance")
    
复制代码

因为现在没有鸭子对象,只能那火鸡对象冒充。由于鸭子对象和火鸡对象功能不同,不能直接拿来用,现在就需要使用适配器来完成这个功能:

class TurkeyAdapter(Duck):
    turkey = Turkey()  # 这里实际使用的是火鸡对象
    
    # 实现鸭子对象拥有的quack方法
    def quack(self):
        self.turkey.gobble()
    
    def fly(self):
        # 假设火鸡比鸭子飞的短,为了模拟鸭子的动作,多飞几次
        for i in range(5):
            turkey.fly()
复制代码

接下来调用就可以像使用鸭子对象一样使用火鸡适配后的对象。

# test

duck = Duck()
duck.quack()
duck.fly()

turkey_adapter = Duck()
turkey_adapter.quack()
turkey_adapter.fly()
复制代码

现在再来看一下适配器使用的过程:

python 设计模式-适配器模式
  1. 客户通过被适配者实现的接口调用适配器
  2. 适配器将请求转换为被适配者可以响应的请求
  3. 被适配者响应,把结果返回给适配器,然后适配器再将结果响应给客户。

通过这个例子,接下来看一下适配器模式的正式定义

定义

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

优点

  • 可以通过创建适配器进行接口转换,让不兼容的接口兼容,让客户从实现的接口的解耦。
  • 使用对象组合,以修改的接口包装被适配者
  • 被适配的子类可以搭配着适配器使用
  • 满足开放/封闭原则(open/close principle)

开放/封闭原则 是面向对象设计的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改是关闭的。

真实世界中的适配器

  • xmltodict 可以将 xml 转换为 json
  • grpc 也可以认为是一种适配器,提供了跨语言调用能力
  • sqlalchemy 可以在不改变代码的情况下对接多种数据库

本文例子来自《Head First 设计模式》。

最后,感谢女朋友支持和包容,比:heart:

也可以在公号输入以下关键字获取历史文章: 公号&小程序 | 设计模式 | 并发&协程

python 设计模式-适配器模式

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

区块链核心算法解析

区块链核心算法解析

【瑞士】Roger Wattenhofer(罗格.瓦唐霍费尔) / 陈晋川、薛云志、林强、祝庆 / 电子工业出版社 / 2017-8 / 59.00

《区块链核心算法解析》介绍了构建容错的分布式系统所需的基础技术,以及一系列允许容错的协议和算法,并且讨论一些实现了这些技术的实际系统。 《区块链核心算法解析》中的主要概念将独立成章。每一章都以一个小故事开始,从而引出该章节的内容。算法、协议和定义都将以形式化的方式描述,以便于读者理解如何实现。部分结论会在定理中予以证明,这样读者就可以明白为什么这些概念或算法是正确的,并且理解它们可以确保实现......一起来看看 《区块链核心算法解析》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具