适配器模式

什么是适配器模式?

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

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)

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

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

推荐使用对象适配器

原文地址:https://www.cnblogs.com/whnba/p/11965607.html