当前位置: 代码迷 >> 综合 >> Design Patterns - Chain of Responsibility
  详细解决方案

Design Patterns - Chain of Responsibility

热度:94   发布时间:2023-10-21 05:02:04.0

Chain of Responsibility(职责链) — 对象行为型模式

使多个对象都有机会处理请求,从而避免其你去的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用场景

  1. 有多个对象可以处理一个请求,哪个对象处理该请求运行时自动确定。
  2. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
  3. 可处理一个请求的对象集合应被动态指定。

UML图

Design Patterns - Chain of Responsibility

效果

  1. 降低耦合度:该模式使得一个对象无须知道是其他哪一个对象处理其请求。对象仅需要知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确信息,且链中的对象不需要知道链的结构。

实现

#经理类
class Manager:successor=Nonename=''def __init__(self,name):self.name=name#设置上级 def setSuccessor(self,successor):self.successor=successor#处理请求def handleRequest(self,request):pass#直属经理
class LineManager(Manager):def handleRequest(self,request):if request.requestType=='little' :print('requestType: %s ,requestContent: %s,' %(request.requestType,request.requestContent))print('小事一桩,我这个小小的line manager就能搞定')else:if self.successor !=None:print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))print('非小事,我这个小小的line manager无能为力,交上级处理')print('上级是:',self.successor)self.successor.handleRequest(request)#部门经理
class DepartmentManager(Manager):def handleRequest(self,request):if request.requestType=='middle' :print('requestType: %s ,requestContent: %s ' %(request.requestType,request.requestContent))print('中级事件,我这个department manager就能搞定')else:if  self.successor !=None:               print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))print('非中级事件,我这个department manager无能为力,交上级处理' )print('上级是:',self.successor)self.successor.handleRequest(request)def __str__(self):return 'Department Manager '#总经理
class GeneralManager(Manager):def handleRequest(self,request):if request.requestType=='big' :print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))print('大事件,得由我这个 general manager拍板')def __str__(self):return 'General Manager 'class Request():def __init__(self,requestType,requestContent):self.requestType=requestTypeself.requestContent=requestContentdef commit(self,manager):ret=manager.handleRequest(self)

client

if __name__=='__main__':line_manager=LineManager('Line Manager')department_manager=DepartmentManager('Department Manager')general_manager=GeneralManager('General Manager')line_manager.setSuccessor(department_manager)department_manager.setSuccessor(general_manager)print('==========================================================')request=Request('little','请批准团队外出腐败经费1000元')request.commit(line_manager)print('==========================================================')request=Request('middle','请批准团队外出旅游10000元')request.commit(line_manager)print('==========================================================')request=Request('big','请批准团队设备购买100000元')request.commit(line_manager)"""output ========================================================== requestType: little ,requestContent: 请批准团队外出腐败经费1000元, 小事一桩,我这个小小的line manager就能搞定 ========================================================== requestType: middle ,requestContent: 请批准团队外出旅游10000元 非小事,我这个小小的line manager无能为力,交上级处理 上级是: Department Manager requestType: middle ,requestContent: 请批准团队外出旅游10000元 中级事件,我这个department manager就能搞定 ========================================================== requestType: big ,requestContent: 请批准团队设备购买100000元 非小事,我这个小小的line manager无能为力,交上级处理 上级是: Department Manager requestType: big ,requestContent: 请批准团队设备购买100000元 非中级事件,我这个department manager无能为力,交上级处理 上级是: General Manager requestType: big ,requestContent: 请批准团队设备购买100000元 大事件,得由我这个 general manager拍板Process finished with exit code 0"""
  相关解决方案