Python设计模式——前端控制器(Front Controller)

前端控制器(Front Controller)

前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。

返回 Python设计模式-outline

示例

class MobileView:
    def show_index_page(self):
        print("Displaying mobile index page")


class TabletView:
    def show_index_page(self):
        print("Displaying tablet index page")


class Dispatcher:
    def __init__(self):
        self.mobile_view = MobileView()
        self.tablet_view = TabletView()

    def dispatch(self, request):
        """
        This function is used to dispatch the request based on the type of device.
        If it is a mobile, then mobile view will be called and if it is a tablet,
        then tablet view will be called.
        Otherwise, an error message will be printed saying that cannot dispatch the request.
        """
        if request.type == Request.mobile_type:
            self.mobile_view.show_index_page()
        elif request.type == Request.tablet_type:
            self.tablet_view.show_index_page()
        else:
            print("Cannot dispatch the request")


class RequestController:
    """front controller"""

    def __init__(self):
        self.dispatcher = Dispatcher()

    def dispatch_request(self, request):
        """
        This function takes a request object and sends it to the dispatcher.
        """
        if isinstance(request, Request):
            self.dispatcher.dispatch(request)
        else:
            print("request must be a Request object")


class Request:
    """request"""

    mobile_type = "mobile"
    tablet_type = "tablet"

    def __init__(self, request):
        self.type = None
        request = request.lower()
        if request == self.mobile_type:
            self.type = self.mobile_type
        elif request == self.tablet_type:
            self.type = self.tablet_type


def main():    
    front_controller = RequestController()

    front_controller.dispatch_request(Request('mobile'))
    # 预期输出
    # Displaying mobile index page

    front_controller.dispatch_request(Request('tablet'))
    # 预期输出
    # Displaying tablet index page

    front_controller.dispatch_request(Request('desktop'))
    # 预期输出
    # Cannot dispatch the request

    front_controller.dispatch_request('mobile')
    # 预期输出
    # request must be a Request object
    

ref

https://www.cnblogs.com/luqingfei/archive/2013/03/20/2971142.html
http://www.phpxs.com/j/design/1000258/

posted @ 2022-07-26 17:48  坦先生的AI资料室  阅读(174)  评论(0编辑  收藏  举报