【设计模式】装饰器模式

前言

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中常用的设计模式,通过使用这些设计模式可以提高代码的可读性、可维护性和重用性。

装饰器模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的功能,而无需修改其代码。装饰器模式通过创建一系列装饰器类,每个装饰器类都包装了一个具体组件(component)的实例,从而实现透明的、可叠加的功能扩展。

装饰器模式

 普通装饰器

def decorator(func):
    def new_func(*args,**kwargs):
        "do something"
        res = func(*args,**kwargs)
        "do something"
        return res

    return new_func

@decorator
def get_name():
    pass

 带参数装饰器

def new_decorator(pas=""):
    def decorator(func):
        def new_func(*args,**kwargs):
            "do something"
            print(pas)
            res = func(*args,**kwargs)
            "do something"
            return res

        return new_func
    return decorator


@new_decorator('new prams')
def get_name():
    pass

缺点

 装饰器的用处不用多说,函数校验、进入日志、函数执行前后处理等多场景都需要用到,它也有一点副作用。

def tow_decorator(func):
    def new_func(*args, **kwargs):
        """new_func function"""
        res = func(*args, **kwargs)
        print("do other something")
        return res

    return new_func

@tow_decorator
def get_name():
    """get_name function"""
    print('jjjjjj')
if __name__ == '__main__':
    import inspect
    print(inspect.signature(get_name))
    x = inspect.getsource(get_name)
    print(x)
    print(get_name.__doc__)

# 结果
(*args, **kwargs) # 函数签名
    def new_func(*args, **kwargs): # 函数源码
        """new_func function"""
        res = func(*args, **kwargs)
        print("do other something")
        return res
‘new_func function’ # 函数文档

 由于get_name被装饰后指向的是new_func函数,所以获取的信息不再是get_name函数的说明了,对于调试是不方便的。我们可以使用functools模块的wraps函数基本消除这个副作用

改进 

def tow_decorator(func):
    @functools.wraps(func)
    def new_func(*args, **kwargs):
        """new_func function"""
        res = func(*args, **kwargs)
        print("do other something")
        return res

    return new_func

@tow_decorator
def get_name():
    """get_name function"""
    print('jjjjjj')
if __name__ == '__main__':
    print(get_name.__doc__)

# 结果
()
@tow_decorator
def get_name():
    """get_name function"""
    print('jjjjjj')
get_name function

 应用场景

  •  日志记录: 装饰器可以用于添加日志记录功能,记录函数或方法的调用时间、参数和返回值,以便进行调试或性能分析。
def log_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} called with arguments {args} and result {result}")
        return result
    return wrapper

@log_decorator
def add(a, b):
    return a + b
  • 权限检查: 装饰器可以用于检查用户权限,确保只有具有特定权限的用户才能访问某个函数或方法。
def check_permission(permission_required):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if user_has_permission(permission_required):
                return func(*args, **kwargs)
            else:
                raise PermissionError("Permission denied")
        return wrapper
    return decorator

@check_permission("admin")
def delete_user(user_id):
    # 删除用户的逻辑
  • 缓存: 装饰器可以用于添加缓存功能,避免重复计算相同输入的函数结果。
def cache_decorator(func):
    cache = {}

    def wrapper(*args, **kwargs):
        key = (args, frozenset(kwargs.items()))
        if key not in cache:
            result = func(*args, **kwargs)
            cache[key] = result
        return cache[key]

    return wrapper

@cache_decorator
def expensive_operation(x, y):
    # 执行具体函数操作
  •  性能分析: 装饰器可以用于测量函数或方法的执行时间,以便进行性能分析。
import time

def performance_analysis(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to execute")
        return result
    return wrapper

@performance_analysis
def time_consuming_operation():
    # 执行耗时的操作

参考链接:

https://www.cnblogs.com/cwp-bg/p/9547797.html

装饰器 - 廖雪峰的官方网站

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式通过创建一个装饰类来包装原始的类,从而实现动态地扩展一个对象的功能。装饰类和被装饰类可以独立发展,它们之间没有耦合关系。装饰器模式是继承的一个替代模式,它避免了使用继承来扩展对象功能所带来的静态特性。 在C++中,可以通过使用抽象类和具体类来实现装饰器模式。首先创建一个抽象类(比如Shape)作为基类,然后创建具体的类(比如Circle和Rectangle)作为子类。这些子类实现了抽象类中的纯虚函数(比如draw),分别表示不同的图形。 在使用装饰器模式时,我们可以创建一个装饰类,它也是抽象类的子类,并且它的对象包含一个抽象类对象的指针。装饰类可以在原始对象的基础上添加额外的功能,同时保持原始对象的接口不变。通过使用装饰器模式,我们可以动态地扩展一个对象的功能,而无需修改原始对象的结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++设计模式装饰器模式](https://blog.csdn.net/m0_73443478/article/details/129751085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资料加载中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值