Skip to content

Instantly share code, notes, and snippets.

@hmthanh
Created August 14, 2021 08:43
Show Gist options
  • Save hmthanh/98b6cd5d2437496ea92b847daa0c3d15 to your computer and use it in GitHub Desktop.
Save hmthanh/98b6cd5d2437496ea92b847daa0c3d15 to your computer and use it in GitHub Desktop.
Chain Responsibility Design Pattern Example in Python
# Chain Responsibility Design Pattern Example in Python
from abc import abstractmethod
class LeaveRequest:
def __init__(self, date: int):
self.date = date
def get(self) -> int:
return self.date
class Approver:
def __init__(self):
self.next_approver = None
def set_next(self, approver):
self.next_approver = approver
return self.next_approver
def approved_leave(self, request: LeaveRequest):
if self.can_approve(request.get()):
self.do_approving(request)
else:
self.next_approver.approved_leave(request)
@abstractmethod
def can_approve(self, num_date: int) -> bool:
pass
@abstractmethod
def do_approving(self, request: LeaveRequest):
pass
class Supervisor(Approver):
def __int__(self):
super().__init__()
@abstractmethod
def do_approving(self, request: LeaveRequest):
print("Supervisor approved ", request.get())
def can_approve(self, num_date: int) -> bool:
return num_date <= 3
class DeliverManager(Approver):
def __int__(self):
super().__init__()
@abstractmethod
def do_approving(self, request: LeaveRequest):
print("Deliver Manager approved ", request.get())
def can_approve(self, num_date: int) -> bool:
return 3 < num_date <= 5
class Director(Approver):
def __int__(self):
super().__init__()
@abstractmethod
def do_approving(self, request: LeaveRequest):
print("Director approved ", request.get())
def can_approve(self, num_date: int) -> bool:
return num_date > 5
def get_approved():
supervisor = Supervisor()
deliver = supervisor.set_next(DeliverManager())
deliver.set_next(Director())
return supervisor
if __name__ == '__main__':
approve = get_approved()
leave_request = LeaveRequest(3)
approve.approved_leave(leave_request)
leave_request = LeaveRequest(4)
approve.approved_leave(leave_request)
leave_request = LeaveRequest(5)
approve.approved_leave(leave_request)
leave_request = LeaveRequest(6)
approve.approved_leave(leave_request)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment