职责链模式(python)

本文介绍了一种设计模式——职责链模式,通过实例演示了如何使用该模式处理不同类型的请求,如请假和加薪等,避免请求发送者和接收者之间的直接耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

职责链模式将能处理请求的对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理请求为止,避免请求的发送者和接收者之间的耦合关系


#encoding=utf-8
#
#by panda
#职责连模式

def printInfo(info):
    print unicode(info, 'utf-8').encode('gbk')

#抽象职责类
class Manager():
    successor = None
    name = ''
    def __init__(self, name):
        self.name = name
    
    def SetSuccessor(self, successor):
        self.successor = successor
    
    def HandleRequest(self, request):
        pass

#具体职责类:经理
class CommonManager(Manager):
    def HandleRequest(self, request):
        if request.RequestType == '请假' and request.Number <= 2:
            printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number))
        else:
            if self.successor != None:
                self.successor.HandleRequest(request)
                
#具体职责类:总监
class Majordomo(Manager):
    def HandleRequest(self, request):
        if request.RequestType == '请假' and request.Number <= 5:
            printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number))
        else:
            if self.successor != None:
                self.successor.HandleRequest(request)

#具体职责类:总经理
class GeneralManager(Manager):
    def HandleRequest(self, request):
        if request.RequestType == '请假':
            printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number))
        elif request.RequestType == '加薪' and request.Number <= 500:
            printInfo('%s:%s 数量%d 被批准' % (self.name, request.RequestContent, request.Number))
        elif request.RequestType == '加薪' and request.Number > 500:
            printInfo('%s:%s 数量%d 再说吧' % (self.name, request.RequestContent, request.Number))

class Request():
    RequestType = ''
    RequestContent = ''
    Number = 0

def clientUI():
    jinLi = CommonManager('金力')
    zongJian = Majordomo('宗健')
    zhongJingLi = GeneralManager('钟金利')
    
    jinLi.SetSuccessor(zongJian)
    zongJian.SetSuccessor(zhongJingLi)
    
    request = Request()
    request.RequestType = '请假'
    request.RequestContent = '小菜请假'
    request.Number = 1
    jinLi.HandleRequest(request)
    
    request.RequestType = '请假'
    request.RequestContent = '小菜请假'
    request.Number = 5
    jinLi.HandleRequest(request)
    
    request.RequestType = '加薪'
    request.RequestContent = '小菜要求加薪'
    request.Number = 500
    jinLi.HandleRequest(request)
    
    request.RequestType = '加薪'
    request.RequestContent = '小菜要求加薪'
    request.Number = 1000
    jinLi.HandleRequest(request)
    return

if __name__ == '__main__':
    clientUI();

类图




### 职责链设计模式的概念 职责链设计模式是一种行为型设计模式,其核心思想是将请求沿着处理者链进行传递,直到其中一个处理者能够处理该请求为止[^2]。这种模式的主要优点在于解耦请求的发送者和接收者,使系统更加灵活和可扩展[^1]。 在职责链模式中,通常会有一个抽象处理者(Handler)和多个具体处理者(ConcreteHandler)。抽象处理者定义了一个处理请求的接口,并维护一个指向下一个处理者的引用。具体处理者实现了处理请求的方法,并决定是否能够处理请求,如果不能处理,则将请求传递给下一个处理者[^3]。 --- ### 职责链设计模式的用法 职责链设计模式适用于以下场景: - 请求的处理者不确定,或者有多个处理者可以处理同一请求。 - 需要动态地指定一组对象来处理请求。 - 需要避免请求发送者与接收者之间的直接耦合。 使用职责链模式时,需要明确以下几点: 1. 定义一个抽象处理者类,包含处理请求的接口以及指向下一个处理者的引用。 2. 创建具体处理者类,继承抽象处理者类并实现具体的处理逻辑。 3. 将具体处理者链接起来,形成一条职责链。 4. 发送请求到链中的第一个处理者,由它负责将请求传递给后续的处理者。 --- ### 职责链设计模式的实现示例 以下是职责链设计模式的一个简单实现示例,使用 Python 编写: #### 示例场景 模拟一个根据用户信用评级给予不同授信额度的场景。根据用户的信用评级,不同的处理者会决定用户的授信额度。 ```python class Handler: def __init__(self, successor=None): self.successor = successor # 下一个处理者 def handle(self, request): if self.successor: return self.successor.handle(request) # 如果当前处理者无法处理请求,传递给下一个处理者 return None class ConcreteHandlerA(Handler): def handle(self, request): if request == "A": return f"ConcreteHandlerA handled {request}" else: return super().handle(request) class ConcreteHandlerB(Handler): def handle(self, request): if request == "B": return f"ConcreteHandlerB handled {request}" else: return super().handle(request) class ConcreteHandlerC(Handler): def handle(self, request): if request == "C": return f"ConcreteHandlerC handled {request}" else: return super().handle(request) # 测试代码 handler_a = ConcreteHandlerA() handler_b = ConcreteHandlerB() handler_c = ConcreteHandlerC() # 构建职责链 handler_a.successor = handler_b handler_b.successor = handler_c # 处理请求 print(handler_a.handle("A")) # 输出: ConcreteHandlerA handled A print(handler_a.handle("B")) # 输出: ConcreteHandlerB handled B print(handler_a.handle("C")) # 输出: ConcreteHandlerC handled C print(handler_a.handle("D")) # 输出: None (没有处理者能处理 D) ``` 在这个示例中,`Handler` 是抽象处理者类,`ConcreteHandlerA`、`ConcreteHandlerB` 和 `ConcreteHandlerC` 是具体处理者类。每个具体处理者都尝试处理请求,如果无法处理,则将请求传递给下一个处理者。 --- ### 解释 1. **抽象处理者**:`Handler` 类定义了处理请求的接口,并维护一个指向下一个处理者的引用。 2. **具体处理者**:`ConcreteHandlerA`、`ConcreteHandlerB` 和 `ConcreteHandlerC` 实现了具体的处理逻辑。如果当前处理者无法处理请求,则调用下一个处理者的 `handle` 方法。 3. **职责链构建**:通过设置 `successor` 属性,将具体处理者链接成一条职责链。 4. **请求传递**:当请求被发送到链中的第一个处理者时,它会依次尝试处理请求或将其传递给下一个处理者。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值