Created
August 14, 2021 08:43
-
-
Save hmthanh/98b6cd5d2437496ea92b847daa0c3d15 to your computer and use it in GitHub Desktop.
Chain Responsibility Design Pattern Example in Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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