zoukankan      html  css  js  c++  java
  • 适配器模式

    什么是适配器模式?

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

    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)

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

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

    推荐使用对象适配器

  • 相关阅读:
    22:django 配置详解
    21:序列化django对象
    20:django中的安全问题
    19:django 分页
    HTML 标签(一)
    流程图学习绘制
    HTTP原理
    终端的颜色代码
    Python 进程 线程总结
    Python Select模型
  • 原文地址:https://www.cnblogs.com/whnba/p/11965607.html
Copyright © 2011-2022 走看看