設計模式之十三--職責鏈模式

職責鏈模式:是多個對象都有機會處理請求,從而避免請求的法總這和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,知道有一個對象處理它爲止。

這個模式在公司中非常常見,一個人請假,先從自己的leader開始,然後進一步到科長,總經理。職責鏈條非常清晰。

from abc import ABCMeta, abstractmethod


class Manager(metaclass=ABCMeta):

    def __init__(self, name):
        self.name = name
        self._supervisor = None

    @abstractmethod
    def set_supervisor(self, supervisor):
        pass

    @abstractmethod
    def handle_request(self, request):
        pass


class Leader(Manager):

    def __init__(self, name):
        self.supervisor = None
        super().__init__(name)

    def set_supervisor(self, supervisor):
        self.supervisor = supervisor

    def handle_request(self, request):
        if request.request_type is "day_off" and request.number < 2:
            print("{0}:{1} number {2} is approved".format(self.name, request.request_content, request.number))

        else:
            if self.supervisor is not None:
                self.supervisor.handle_request(request)


class SectionChief(Manager):

    def __init__(self, name):
        self.supervisor = None
        super().__init__(name)

    def set_supervisor(self, supervisor):
        self.supervisor = supervisor

    def handle_request(self, request):
        if request.request_type is "day_off" and request.number < 5:
            print("{0}:{1} number {2} is approved".format(self.name, request.request_content, request.number))
        else:
            if self.supervisor is not None:
                self.supervisor.handle_request(request)


class GeneralManager(Manager):

    def __init__(self, name):
        self.supervisor = None
        super().__init__(name)

    def set_supervisor(self, supervisor):
        self.supervisor = supervisor

    def handle_request(self, request):
        if request.request_type is "salary_increase" and request.number < 1000:
            print("{0}:{1} number {2} is approved".format(self.name, request.request_content, request.number))
        else:
            print("{0}:{1} number {2} is not approved".format(self.name, request.request_content, request.number))


class Request:
    def __init__(self):
        self.__request_type = None
        self.__request_content = None
        self.__number = None

    @property
    def request_type(self):
        return self.__request_type

    @request_type.setter
    def request_type(self, value):
        self.__request_type = value

    @property
    def request_content(self):
        return self.__request_content

    @request_content.setter
    def request_content(self, value):
        self.__request_content = value

    @property
    def number(self):
        return self.__number

    @number.setter
    def number(self, value):
        self.__number = value


if __name__ == "__main__":
    leader = Leader("Jordon")
    section_chief = SectionChief("Martin")
    general_manager = GeneralManager("Dell")

    leader.set_supervisor(section_chief)
    section_chief.set_supervisor(general_manager)

    request = Request()
    request.request_type = "day_off"
    request.request_content = "Li ask day off"
    request.number = 4
    leader.handle_request(request)

    request = Request()
    request.request_type = "salary_increase"
    request.request_content = "Li ask for salary increase"
    request.number = 1200

    leader.handle_request(request)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章