【设计模式】适配器模式

2024-01-07 23:29:32

前言

1. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局的访问点。

2. 工厂模式(Factory Pattern):定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。

3. 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新。

4. 装饰器模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,而不会影响到其他对象。

5. 策略模式(Strategy Pattern):定义一系列的算法,将每个算法封装起来,并使它们可以相互替换。

6. 命令模式(Command Pattern):将请求封装成一个对象,从而使用户可以用不同的请求对客户进行参数化。

7. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类能够一起工作。

8. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的接口,从而使得子系统更加容易使用。

9. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为。

10. 模板方法模式(Template Method Pattern):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。

这些是Python中常用的设计模式,通过使用这些设计模式可以提高代码的可读性、可维护性和重用性。

适配器模式

适配器模式是一种结构设计模式,它允许接口不兼容的类能够一起工作。适配器模式通过引入一个适配器类,将原始类的接口转换成客户端所期望的接口,从而使得原本不能一起工作的类能够协同工作。

示例代码

在Python中,适配器模式通常通过类或对象适配器的方式实现。

  1. Target:即所期望的接口。
  2. Adaptee:被继承的类。
  3. Adapter:将 Adaptee 类转化到增加了新功能的 Target 接口。

类适配器:

from abc import ABC, abstractmethod


class Target(ABC):
    @abstractmethod
    def operation1(self):
        pass

    @abstractmethod
    def operation2(self):
        pass


class Adaptee:
    def operation1(self):
        str(self)
        print('adaptee.operation1')


class Adapter(Adaptee, Target):
    def __init__(self):
        self.adaptee = Adaptee()

    def operation2(self):
        print('adaptee.operation2')


if __name__ == '__main__':
    adapter = Adapter()
    adapter.operation1()
    adapter.operation2()

?对象适配器:

from abc import ABC, abstractmethod


class Target(ABC):
    @abstractmethod
    def operation1(self):
        pass

    @abstractmethod
    def operation2(self):
        pass


class Adaptee:
    def operation1(self):
        str(self)
        print('adaptee.operation1')


class Adapter(Target):
    def __init__(self):
        self.adaptee = Adaptee()

    def operation1(self):
        self.adaptee.operation1()

    def operation2(self):
        print('adaptee.operation2')


if __name__ == '__main__':
    adapter = Adapter()
    adapter.operation1()
    adapter.operation2()

类适配器模式与对象适配器模式在形式上的区别是,类适配器模式对被适配对象采用了继承,而对象适配器对被适配对象采用的则是调用。?如果一个被适配源类中有大量的方法,使用类适配器模式比较容易,只需要让 Adapter 类继承被适配的源类即可。

具体实例

假设您有一个现有的类 Logger,它提供了一种将消息记录到文件的方法。 此类需要将文件指定为文件路径字符串

class Logger:
    def __init__(self, file_path: str):
        self.file_path = file_path

    def log(self, message: str):
        with open(self.file_path, 'a') as file:
            file.write(message + '\n')

?现在假设您有一个客户端想要使用 Logger 类,但它希望传递一个文件对象而不是文件路径字符串。 在这种情况下,您可以创建一个适配器类,它接受一个文件对象并使用它来创建一个 Logger 实例:

class FileLoggerAdapter:
    def __init__(self, file: File):
        self.logger = Logger(file.name)

    def log(self, message: str):
        self.logger.log(message)

?此适配器类允许客户端代码使用 FileLoggerAdapter 类,就好像它具有与 Logger 类相同的接口一样,但它在幕后将文件对象转换为文件路径字符串。 客户端可以像这样使用适配器类:

# Open a file for writing
file = open('log.txt', 'w')

# Create a FileLoggerAdapter instance
logger = FileLoggerAdapter(file)

# Log a message using the adapter
logger.log('This is a log message')

应用场景

  1. 与现有类库或第三方库集成: 当你需要使用某个类,但它的接口与你的代码不兼容时,适配器模式可以用于将它们协同工作。

  2. 系统扩展和升级: 当系统中的某个组件发生变化,需要与旧的组件一起工作时,适配器模式可以帮助适应新的接口,而不必修改现有的代码。

  3. 接口标准化: 当你希望将一组类的接口标准化,以便于使用相同的接口进行交互时,适配器模式可以帮助创建统一的接口。


参考链接:

Python适配器模式简述 - 知乎

Python设计模式(7):适配器模式-腾讯云开发者社区-腾讯云

文章来源:https://blog.csdn.net/qq_44091004/article/details/135445576
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。