github地址:https://github.com/cheesezh/python_design_patternspython
用程序模擬如下情景git
class Request(): def __init__(self): self.type = None # 申請類型 self.content = None # 申請內容 self.number = 0 # 申請數量 class Manager(): def __init__(self, name): self.name = name def get_result(self, manager_level, request): if manager_level == "經理": if request.type == "請假" and request.number <=2: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) else: print("{}:{} 數量 {} 我無權處理".format(self.name, request.content, request.number)) elif manager_level == "總監": if request.type == "請假" and request.number <=5: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) else: print("{}:{} 數量 {} 我無權處理".format(self.name, request.content, request.number)) elif manager_level == "總經理": if request.type == "請假": print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif request.type == "加薪" and request.number <= 500: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif request.type == "加薪" and request.number > 500: print("{}:{} 數量 {} 再說吧".format(self.name, request.content, request.number)) def main(): jingli = Manager("經理") zongjian = Manager("總監") zongjingli = Manager("總經理") request = Request() request.type = "加薪" request.content = "賀賀請求加薪" request.number = 1000 jingli.get_result(jingli.name, request) zongjian.get_result(zongjian.name, request) zongjingli.get_result(zongjingli.name, request) request.type = "請假" request.content = "賀賀請求請假" request.number = 3 jingli.get_result(jingli.name, request) zongjian.get_result(zongjian.name, request) zongjingli.get_result(zongjingli.name, request) main()
經理:賀賀請求加薪 數量 1000 我無權處理 總監:賀賀請求加薪 數量 1000 我無權處理 總經理:賀賀請求加薪 數量 1000 再說吧 經理:賀賀請求請假 數量 3 我無權處理 總監:賀賀請求請假 數量 3 被批准 總經理:賀賀請求請假 數量 3 被批准
職責鏈模式,使得多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,知道有一個對象處理它爲止[DP]。github
from abc import ABCMeta, abstractmethod class Handler(): __metaclass__ = ABCMeta def __init__(self): self.successor = None # 設置繼任者 @abstractmethod def handle_request(self, request): pass class ConcretHandler1(Handler): """ 處理0-10的請求 """ def handle_request(self, request): if request >=0 and request < 10: print("handler1 handle request [ {} ]".format(request)) elif self.successor != None: # 由繼任者處理請求 self.successor.handle_request(request) class ConcretHandler2(Handler): """ 處理10-20的請求 """ def handle_request(self, request): if request >=10 and request < 20: print("handler2 handle request [ {} ]".format(request)) elif self.successor != None: # 由繼任者處理請求 self.successor.handle_request(request) class ConcretHandler3(Handler): """ 處理20-30的請求 """ def handle_request(self, request): if request >=20 and request < 30: print("handler3 handle request [ {} ]".format(request)) elif self.successor != None: # 由繼任者處理請求 self.successor.handle_request(request) def main(): h1 = ConcretHandler1() h2 = ConcretHandler2() h3 = ConcretHandler3() h1.successor = h2 h2.successor = h3 requests = [2, 5, 14, 22, 18, 3, 27, 20] for i in requests: h1.handle_request(i) main()
handler1 handle request [ 2 ] handler1 handle request [ 5 ] handler2 handle request [ 14 ] handler3 handle request [ 22 ] handler2 handle request [ 18 ] handler1 handle request [ 3 ] handler3 handle request [ 27 ] handler3 handle request [ 20 ]
from abc import ABCMeta, abstractmethod class Manager(): __metaclass__ = ABCMeta def __init__(self, name): self.name = name self.successor = None @abstractmethod def handle_request(self, request): pass class CommonManager(Manager): def handle_request(self, request): if request.type == "請假" and request.number <=2: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif self.successor != None: self.successor.handle_request(request) class Majordomo(Manager): def handle_request(self, request): if request.type == "請假" and request.number <=5: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif self.successor != None: self.successor.handle_request(request) class GeneralManager(Manager): def handle_request(self, request): if request.type == "請假": print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif request.type == "加薪" and request.number <= 500: print("{}:{} 數量 {} 被批准".format(self.name, request.content, request.number)) elif request.type == "加薪" and request.number > 500: print("{}:{} 數量 {} 再說吧".format(self.name, request.content, request.number)) def main(): jingli = CommonManager("經理") zongjian = Majordomo("總監") zongjingli = GeneralManager("總經理") jingli.successor = zongjian zongjian.successor = zongjingli request = Request() request.type = "加薪" request.content = "賀賀請求加薪" request.number = 1000 jingli.handle_request(request) request.type = "請假" request.content = "賀賀請求請假" request.number = 3 jingli.handle_request(request) main()
總經理:賀賀請求加薪 數量 1000 再說吧 總監:賀賀請求請假 數量 3 被批准