菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
319
0

适配器模式

原创
05/13 14:22
阅读数 85109

什么是适配器模式?

将一个接口转换成客户需要的接口,已达到在新对象中使用以前的旧接口。属于结构型模式,该模式主要解决对以前旧接口的兼容性。

UML类图

对象适配器

'''
示例:  键盘PS2圆形接口转USB接口
'''

import abc

# 目标接口


class AbsUSB(abc.ABC):
    @abc.abstractmethod
    def print(self): ...

# 以前旧接口


class AbsPS2(abc.ABC):
    @abc.abstractmethod
    def out(self): ...

# 旧对象


class KeyboardPS2(AbsPS2):
    def out(self):
        return "ps2"

# 适配器


class Adapter(AbsUSB):

    def __init__(self, ps2: AbsPS2):
        self.ps2 = ps2

    def print(self):
        '让旧ps2接口 兼容 usb 接口'
        s = self.ps2.out()
        return s + " to usb"


if __name__ == "__main__":

    ps2 = KeyboardPS2()   # 旧对象
    usb = Adapter(ps2)    # 通过适配器把旧对象转换成目标对象接口

    p = usb.print()

    print(p)

 

类适配器

'''
示例:  键盘PS2圆形接口转USB接口
类适配器模式是采用多继承的方式来实现
'''

import abc

# 目标接口


class AbsUSB(abc.ABC):
    @abc.abstractmethod
    def print(self): ...

# 以前旧接口


class AbsPS2(abc.ABC):
    @abc.abstractmethod
    def out(self): ...

# 旧对象


class KeyboardPS2(AbsPS2):
    def out(self):
        return "ps2"

# 适配器


class PS2AdapterUSB(AbsUSB, KeyboardPS2):

    def print(self):
        '让旧ps2接口 兼容 usb 接口'
        s = self.out()
        return s + " to usb"


if __name__ == "__main__":

    usb = PS2AdapterUSB()    # 通过适配器把旧对象转换成目标对象接口

    p = usb.print()

    print(p)

类适配器模式与对象适配器模式区别

类适配器是通过继承具体类型来实现的,强行把他们耦合在一起了;
对象适配器比类适配器更灵活和抽象,实现对具体类型解耦。

推荐使用对象适配器

发表评论

0/200
319 点赞
0 评论
收藏
为你推荐 换一批