装饰器模式是一种设计模式,它允许在不修改原有类的情况下为一个对象添加额外的职责。这种模式通常用于动态地给对象添加功能,例如日志记录、权限检查或事件处理等。基本结构包括一个装饰类和被装饰的类,装饰类中有一个方法来调用被装饰类的某个方法。
本文目录导读:
1、目标类:定义一个接口(通常是抽象类),该接口包含一个或多个方法,这些方法将被装饰器模式中的装饰器所覆盖。
2、具体类:实现目标接口,并包含实际要执行的操作。
3、装饰器:创建一个类,这个类有一个接受目标类作为参数的方法,该方法返回一个新的类,新的类实现了目标接口并可能包含额外的逻辑。
4、使用场景:当需要扩展一个现有类的功能性时,或者希望在不影响现有代码的情况下增加新功能时,可以使用装饰器模式。
示例代码:
定义一个抽象类作为装饰器的目标类 class Logger: def log(self, message): print(f"Logging: {message}") 定义一个具体的类,它继承自抽象类并实现log方法 class MyClass: def __init__(self): self.logger = Logger() def do_something(self): self.logger.log("Doing something") 创建装饰器类 class LogDecorator: def __init__(self, target): self.target = target def __call__(self, *args, **kwargs): instance = self.target(*args, **kwargs) return self.apply(instance) def apply(self, instance): return class Wrapper(instance): def method(self, *args, **kwargs): return super().method(*args, **kwargs) method.__name__ = "decorated_method" return Wrapper(instance) 使用装饰器模式 my_obj = MyClass() decorator = LogDecorator(my_obj) decorator_obj = decorator(my_obj) decorator_obj.do_something() # 输出:Logging: Doing something
在这个例子中,我们使用了装饰器模式来为MyClass
添加了一个log
方法,通过LogDecorator
类,我们可以将任何实现了Logger
接口的对象转换为一个带有额外功能的装饰器,这样,我们就可以在不修改原始类的前提下,为对象添加额外的行为。