首页 > 编程语言 >Python——常用行为模式

Python——常用行为模式

时间:2024-08-21 22:55:06浏览次数:11  
标签:常用 handle 请求 Python self request 模式 处理 return

行为模式(Behavioral Design Patterns) 主要解决的是对象之间的职责划分与协作问题。这类模式通过定义对象间的通信方式、责任分配和行为组织,帮助构建可扩展、灵活的系统,并且通过减少耦合和提高复用性来优化系统行为。

常见的行为模式有:

  • 责任链模式(Chain of Responsibility)
  • 命令模式(Command Pattern)
  • 观察者模式(Observer Pattern)
  • 策略模式(Strategy Pattern)
  • 状态模式(State Pattern)

在这些模式中,责任链模式尤为常见,适用于处理请求时,多个对象可以依次对其进行处理,直到有对象处理完成为止。


1. 责任链模式(Chain of Responsibility Pattern)

原理

责任链模式的核心思想是:将请求沿着一条处理链传递,每个对象有机会处理请求,但不一定必须处理。如果当前对象无法处理,它会将请求传递给下一个对象,直到请求被处理或者到达链的末尾。

  • 解耦请求与处理者:客户端发送请求时,不需要关心由谁处理,也不需要关心具体的处理逻辑。处理者可以动态增加或减少,从而使系统更加灵活。
典型使用场景
  • 异常的分层处理:异常捕获可以从最底层向上层逐级传播,直到有合适的层次处理这个异常。
  • 用户请求的逐层处理:处理用户请求时,从网络层到应用层,每个环节都有机会对请求进行操作,如DNS、HTTP、Socket请求处理等。
  • 权限校验:多个权限层次的校验,可以依次判断每个权限层是否满足,直到通过所有校验或者拒绝。

2. Python 中的责任链模式实现

在 Python 中,责任链模式可以通过类继承方法传递来实现,每个对象负责处理某个具体的任务,或者将请求传递给下一个对象。

示例 1:异常的分层处理

我们可以通过责任链模式逐层捕获和处理异常,从底层向上级抛出,直到有合适的层次处理异常。

class Handler:
    def __init__(self, successor=None):
        self.successor = successor

    def handle(self, request):
        if self.successor:
            return self.successor.handle(request)
        else:
            raise Exception("No handler could process the request")


class ConcreteHandlerA(Handler):
    def handle(self, request):
        if request == "A":
            return f"Handled by A"
        else:
            return super().handle(request)


class ConcreteHandlerB(Handler):
    def handle(self, request):
        if request == "B":
            return f"Handled by B"
        else:
            return super().handle(request)


# 组装责任链
handler = ConcreteHandlerA(ConcreteHandlerB())

# 处理请求
print(handler.handle("A"))  # 输出 "Handled by A"
print(handler.handle("B"))  # 输出 "Handled by B"
# 请求未被处理会抛出异常
# print(handler.handle("C"))  # 抛出 Exception: No handler could process the request
解释:
  • Handler 类:定义了处理请求的基础逻辑,包括向下传递请求的机制。
  • ConcreteHandlerA 和 ConcreteHandlerB:负责具体的请求处理。
  • 责任链结构:通过将不同的 Handler 依次组合,形成处理链。

3. 责任链模式的典型场景

场景 1:用户请求逐层处理(如 DNS, HTTP, Socket)

当用户请求网站失败时,通常会有多个层次来进行逐级处理,如 DNS 解析失败、HTTP 错误、Socket连接问题等。通过责任链模式,我们可以设计一个逐级的请求处理流程,直到确定问题所在。

class DNSHandler(Handler):
    def handle(self, request):
        if request == "DNS":
            return "DNS lookup failed"
        return super().handle(request)

class HTTPHandler(Handler):
    def handle(self, request):
        if request == "HTTP":
            return "HTTP error"
        return super().handle(request)

class SocketHandler(Handler):
    def handle(self, request):
        if request == "Socket":
            return "Socket connection issue"
        return super().handle(request)

# 构建责任链:DNS -> HTTP -> Socket
handler_chain = DNSHandler(HTTPHandler(SocketHandler()))

# 处理逐层请求
print(handler_chain.handle("HTTP"))   # 输出 "HTTP error"
print(handler_chain.handle("Socket")) # 输出 "Socket connection issue"
print(handler_chain.handle("DNS"))    # 输出 "DNS lookup failed"
场景 2:权限校验

权限管理系统中,每个请求可能需要通过不同的权限校验机制,比如用户权限、角色权限、以及特定资源的权限。

class PermissionHandler(Handler):
    def handle(self, request):
        if request == "Admin":
            return "Admin access granted"
        return super().handle(request)

class RoleHandler(Handler):
    def handle(self, request):
        if request == "Manager":
            return "Manager access granted"
        return super().handle(request)

class ResourceHandler(Handler):
    def handle(self, request):
        if request == "Read":
            return "Resource read access granted"
        return super().handle(request)

# 构建责任链:Permission -> Role -> Resource
handler_chain = PermissionHandler(RoleHandler(ResourceHandler()))

# 处理请求
print(handler_chain.handle("Manager"))  # 输出 "Manager access granted"
print(handler_chain.handle("Read"))     # 输出 "Resource read access granted"
场景 3:用户请求日志记录

可以通过责任链模式将用户请求日志分发到不同的日志处理器,如数据库日志、文件日志、和控制台日志。


4. 责任链模式的好处

  • 解耦请求与处理逻辑:客户端不需要知道具体的请求处理者是谁,责任链中的每一个对象都可能处理请求。
  • 灵活的责任分配:可以根据需求动态调整责任链中的对象,添加、移除或更改处理顺序。
  • 可扩展性:当需要增加新的请求处理逻辑时,只需新增相应的处理器即可,不必修改现有代码。

5. 总结

责任链模式通过将请求沿着处理链传递,有效地解耦了请求的发出者和处理者。它在处理异常、请求校验、日志记录等场景中非常有用,帮助系统应对复杂的处理流程。Python 中可以通过类继承与方法传递灵活实现责任链模式,提高系统的可维护性和扩展性。

标签:常用,handle,请求,Python,self,request,模式,处理,return
From: https://blog.csdn.net/pumpkin84514/article/details/141337693

相关文章

  • 【python】类的特殊成员
    上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。无论人或事物往往都有不按套路出牌的情况,Python的类成员也是如此,存在着一些具有特殊含义的成员,详情如下:__in......
  • 【自动化测试必学语言】python:UnitTest框架
    目录介绍框架什么是UnitTest框架?为什么使用UnitTest框架?UnitTest核心要素(unitest的组成部分)1.TestCase(最核心的模块) 2.TestSuite3.TestRunner4.TestLoader5.FixtureTestCase(测试用例)问题1 代码文件的命名不规范问题2代码运行没有结果 问题3没有找到用例......
  • 学习python基础二之python基本图形绘制
    1.课前实例  1.1蟒蛇绘制importturtleast#turtle库取别名为tt.setup(650,350,200,200)t.penup()t.fd(-250)t.pendown()t.pensize(25)t.pencolor("purple")t.seth(-40)foriinrange(4):t.circle(40,80)t.circle(-40,80)t.circle(40,80/2......
  • 【python】面向对象之类成员(属性)
    1.属性的定义1.1:属性的定义有两种方式:装饰器即:在方法上应用装饰器静态字段即:在类中定义值为property对象的静态字段1.2:装饰器方式在类的普通方法上应用@property装饰器经典类classGoods:@propertydefprice(self):return"xwl"#######......
  • Python程序设计现代方法1课后习题1Python 开发概述
    Python程序设计现代方法1课后习题1Python开发概述1.整数求和。输入整数n,计算1~n之和。defsum_of_integers(n):returnsum(range(1,n+1))n=int(input("请输入整数n:"))print(f"1~{n}的和为:{sum_of_integers(n)}")2.整数排序。输入三个整数,把这三个数由......
  • Python被远程主机强制关闭后怎么自动重新运行进程
    要实现Python程序在被远程主机强制关闭后能够自动重新运行,我们可以采用几种方法,但最直接且常用的方法之一是结合操作系统级的工具或脚本。在Linux系统中,我们可以使用cron作业或者systemd服务来实现这一功能;在Windows系统中,可以使用任务计划程序。但在这里,为了提供一个跨平台的、更......
  • 深入理解命令模式:设计模式中的行为型模式解析
    深入理解命令模式:设计模式中的行为型模式解析1.引言设计模式是软件开发中一种经过实践验证的、解决常见问题的方案。行为型设计模式关注对象间的职责分配和通信方式。命令模式(CommandPattern)作为一种重要的行为型模式,主要用于将请求封装成对象,从而将请求的发起者和处理......
  • 【python】面向对象之类成员(字段,方法)
    1.类的成员可以分为三大类:字段、方法和属性注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。2.字段字段包括:普通字段和静态字段,他们在定义和使用中有......
  • 【python】面向对象之继承
    1.什么是继承?通过继承,我们可以从既有的类上衍生出新的类。如果程序的需求为仅修改或删除某项功能,此时不需要将该类的成员数据及成员函数重新写一遍,只需要“继承”原先已定义好的类就可以产生新的类了。继承是指将现有类的属性和行为,经过修改或重写(Override)之后,就可产生出拥有......
  • Python 正则表达式详解 带例题演示
    Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志......