ITPub博客

首页 > 数据库 > 数据库开发技术 > python 面向对象设计模式实践篇(8)-结构型:适配器模式实践

python 面向对象设计模式实践篇(8)-结构型:适配器模式实践

原创 数据库开发技术 作者:程序员小钟同学 时间:2021-03-25 15:14:39 0 删除 编辑

结构型模式概述

定义:前篇初期中,我们的讲过结构型模式主要解决的问题是:

  • 处理实体之间的关系,使得这些实体能够更好地协同工作
  • 结构型模式是类和对象的综合体

它具有的特性:

  • 1:设计过程注重通过组合获得更强大功能的对象和类的结构
  • 2:简化结构并识别类和对象之间的关系
  • 3:主要关注类的继承和组合
  • 4:通过类和对象的模式的

适配器模式


所属分类

  • 结构型模式

意图

  • 定义把一个类的接口转换为客户希望另一个接口.(和现实中的转接头很相似)

适用性

  • 想使用一个已经存在的类,而它的接口不符合你的需求。
  • 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。

背景:

因为我们的面向对象设计原则中有关于开闭原则:

  • 开放: 对扩展开放(通过扩展的方式进行新功能的添加)
  • 封闭: 对修改封闭(尽可能不要去修改已设计完成的)

使用__dict__字典实现方式:

背景:首先定义了三个时代的电脑系统开机的方式:

# 第1代的电脑系统
class Computer_1():

    # 电脑开机方式
    def chick_open(selfs):
        print("第2代电脑,需要【人工】点击方式开机,调用的方法是:chick_open")


# 第2代的电脑系统
class Computer_2():

    # 电脑开机方式
    def sound_open(selfs):
        print("第2代电脑,需要【声控】的方式开机,调用的方法是:sound_open")

# 第3代的电脑系统
class Computer_3():

    # 电脑开机方式
    def face_open(selfs):
        print("第3代电脑,需要【人脸】的方式开机,调用的方法是:face_open")

新增了第四代的计算机:

# 第4代的电脑系统
class Computer_4():

    # 电脑开机方式
    def open(selfs):
        print("第4代电脑,统一方式开机,调用的方法是:open")

现在来为了统一,不管新旧的开机都要直接使用open的方式进行开机,定义中间适配器:


class ComputerAdapter:

        def __init__(self,obj,fusn_arrty={}):
            self.obj = obj
            if fusn_arrty:
                self.__dict__.update(fusn_arrty)


当我们的为所有的电脑开机的时候,统一调用使用第四代的为标准的时候:那么我的适配器调用可以修改为:

if __name__ == '__main__':

    com1 = Computer_1()
    com2 = Computer_2()
    com3 = Computer_3()
    com4 = Computer_4()
    # 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的
    # 动态的把open附加到我们的com4中并且在适配器里进行绑定调用open的时候,其实就是调用,com4.open
    ComputerAdapter(com4,{'open':com4.open}).open()
    # 动态的把open附加到我们的com1中并且在适配器里进行绑定调用open的时候,其实就是调用,com1.chick_open
    ComputerAdapter(com1,{'open':com1.chick_open}).open()
    ComputerAdapter(com2, {'open': com2.sound_open}).open()
    ComputerAdapter(com3, {'open': com3.face_open}).open()

输出的结果为:

第4代电脑,统一方式开机,调用的方法是:open
第1代电脑,需要【人工】点击方式开机,调用的方法是:chick_open
第2代电脑,需要【声控】的方式开机,调用的方法是:sound_open
第3代电脑,需要【人脸】的方式开机,调用的方法是:face_open

如果我现在又退回去,统一使用第三代的人脸识别的话怎么处理呐:

if __name__ == '__main__':

    com1 = Computer_1()
    com2 = Computer_2()
    com3 = Computer_3()
    com4 = Computer_4()
    # 类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的
    # 动态的把open附加到我们的com4中并且在适配器里进行绑定调用open的时候,其实就是调用,com4.open
    ComputerAdapter(com4,{'face_open':com4.open}).face_open()
    # 动态的把open附加到我们的com1中并且在适配器里进行绑定调用open的时候,其实就是调用,com1.chick_open
    ComputerAdapter(com1,{'face_open':com1.chick_open}).face_open()
    ComputerAdapter(com2, {'face_open': com2.sound_open}).face_open()
    ComputerAdapter(com3, {'face_open': com3.face_open}).face_open()

指导意义:

  • 指导我们进行相关接口设计/API设计的时候,要保证相关的代码编写遵循开放/封闭原则等原则,使新代码和旧代码之间能相互兼容处理。

  • 在兼容新旧代码的设计上使用适配器模式,可以避免我们对原有旧代码侵入修改,又能实现新代码和旧代码的兼容。

  • 新旧代码都过适配器的模式可以相互扩展。

  • 使用了适配器模式来获得API一致性和接口兼容性


个人其他博客地址

简书:https://www.jianshu.com/u/d6960089b087

掘金:https://juejin.cn/user/2963939079225608

小钟同学 | 文 【原创】| QQ:308711822

  • 1:本文相关描述主要是个人的认知和见解,如有不当之处,还望各位大佬指正。
  • 2:关于文章内容,有部分内容参考自互联网,如有链接会声明标注;如没有及时标注备注的链接的,如有侵权请联系,我会立即删除处理哟。


原文作者:程序员小钟同学;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-02-20

  • 博文量
    224
  • 访问量
    111726