脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python设计模式中的结构型适配器模式

Python设计模式中的结构型适配器模式

2022-09-27 11:17范桂飓 Python

这篇文章主要介绍了Python设计中的结构型适配器模式,适配器模式即Adapter Pattern,将一个类的接口转换成为客户希望的另外一个接口,下文内容具有一定的参考价值,需要的小伙伴可以参考一下

一、适配器模式

适配器,顾名思义是一种万能的接口,达到万能转换的效果。

适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这些适配接口能够将原来由于接口不兼容而不能在一起工作的多种类型进行适配,使得它们能够一同工作。

二、应用场景

Python设计模式中的结构型适配器模式

三、代码示例

实体角色:

目标接口(Target):定义提供给 Client 访问的接口,可以是一个抽象类或接口,也可以是具体类。
待适配的类 / 适配者类(Adaptee):被适配的角色,它们已经存在了一些接口,是 Client 希望的业务方法,这些接口需要被适配。
适配器(Adapter):作为一个转换器,对 Adaptee Target 进行适配。

方式一

?
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
import abc
 
class Mobile(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def call(self):
        pass
 
 
class Xiaomi(Mobile):
    # 目标接口
    def call(self):
        print(f"使用{self.__class__.__name__}打电话")
 
class Huawei(Mobile):
    # 目标接口
    def call(self):
        print(f"使用{self.__class__.__name__}打电话")
 
 
# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Iphone:
 
    def dial(self):
        print(f"使用{self.__class__.__name__}打电话")
 
 
# 待适配的类。新的手机品牌,打电话的接口与旧的 call 不一样。
class Chuizi:
 
    def dial(self):
        print(f"使用{self.__class__.__name__}打电话")
 
 
# 适配器,使得新的手机品牌打电话接口与旧的适配
class MobileAdapter(Mobile):
 
    def __init__(self, mobile):
        self.mobile = mobile
 
    def call(self):
        self.mobile.dial()
 
 
if __name__ == "__main__":
    xiaomi = Xiaomi()
    xiaomi.call()
 
    huawei = Huawei()
    huawei.call()
 
    iphone = MobileAdapter(Iphone())
    iphone.call()
 
    chuizi = MobileAdapter(Chuizi())
    chuizi.call()

方式二

适配器类通过__dict__ 将需要转化的类的方法注册到适配器,重载 __getattr__ 使其在适配器函数查无方法的时候,执行 getattr 方法。

?
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
class A:
    def a(self):
        print("我是A类的a方法")
 
 
class B:
    def b(self):
        print("我是B类的b方法")
 
 
class C:
    def c(self):
        print("我是C类的c方法")
 
 
class Adapter:
 
    def __init__(self, classname, method):
        self.classname = classname
        self.__dict__update = method
    def __getattr__(self, attr):
        return getattr(self.classname, attr)
 
 
def test():
    objects = []
    AA = A()
    objects.append(Adapter(AA, dict(test=AA.a)))
    BB = B()
    objects.append(Adapter(BB, dict(test=BB.b)))
    CC = C()
    objects.append(Adapter(CC, dict(test=CC.c)))
    for obj in objects:
        obj.test()
 
test()

到此这篇关于Python设计中的结构型适配器模式的文章就介绍到这了,更多相关Python适配器模式内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://is-cloud.blog.csdn.net/article/details/122928395

延伸 · 阅读

精彩推荐
  • Python通过python爬虫赚钱的方法

    通过python爬虫赚钱的方法

    在本篇文章里小编给大家分享了关于通过python爬虫赚钱的方法,有兴趣的朋友们学习下。...

    脚本之家8202021-05-24
  • Python详解Django之admin组件的使用和源码剖析

    详解Django之admin组件的使用和源码剖析

    本篇文章主要介绍了详解Django之admin的使用和源码剖析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    人生不如戏9232021-02-15
  • Python用Python实现协同过滤的教程

    用Python实现协同过滤的教程

    这篇文章主要介绍了用Python实现协同过滤的教程,主要用于从大数据中抽取用户信息偏好等等,需要的朋友可以参考下 ...

    脚本之家5562020-06-02
  • PythonPython编程生成随机用户名及密码的方法示例

    Python编程生成随机用户名及密码的方法示例

    这篇文章主要介绍了Python编程生成随机用户名及密码的方法,结合实例形式分析了Python随机字符串的相关操作技巧,需要的朋友可以参考下...

    难免有错_9492020-10-07
  • PythonPython numpy 点数组去重的实例

    Python numpy 点数组去重的实例

    下面小编就为大家分享一篇Python numpy 点数组去重的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    CUG_Bear6342021-02-01
  • Python设计模式中的原型模式在Python程序中的应用示例

    设计模式中的原型模式在Python程序中的应用示例

    这篇文章主要介绍了设计模式中的原型模式在Python程序中的应用示例,文中主要强调了对浅拷贝和深拷贝在对象复制时的使用,需要的朋友可以参考下 ...

    像风一样的自由4722020-08-14
  • PythonPython中文件I/O高效操作处理的技巧分享

    Python中文件I/O高效操作处理的技巧分享

    文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的。但如何高效的操作处理是需要技巧的,下面这篇文章就主要介绍了Python中文...

    脚本之家4122020-09-19
  • Pythonpython中yield的用法详解

    python中yield的用法详解

    这篇文章主要介绍了python中yield的用法详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    冯爽朗7702021-08-25