【设计模式】适配器模式
前言
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中,适配器模式通常通过类或对象适配器的方式实现。
- Target:即所期望的接口。
- Adaptee:被继承的类。
- 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')
应用场景
-
与现有类库或第三方库集成: 当你需要使用某个类,但它的接口与你的代码不兼容时,适配器模式可以用于将它们协同工作。
-
系统扩展和升级: 当系统中的某个组件发生变化,需要与旧的组件一起工作时,适配器模式可以帮助适应新的接口,而不必修改现有的代码。
-
接口标准化: 当你希望将一组类的接口标准化,以便于使用相同的接口进行交互时,适配器模式可以帮助创建统一的接口。
参考链接:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!