Leetcode – 前端控制器模式

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

  • 前端控制器(Front Controller)
    – 处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。
  • 调度器(Dispatcher)
    – 前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。
  • 视图(View)
    – 视图是为请求而创建的对象。
package main

import "fmt"

type HomeView struct{}

func (h *HomeView) Show() {
    fmt.Println("displaying home page")
}

type StudentView struct{}

func (s *StudentView) Show() {
    fmt.Println("displaying student page")
}

type Dispatcher struct {
    HomeView    *HomeView
    StudentView *StudentView
}

func NewDispatcher() *Dispatcher {
    return &Dispatcher{
        HomeView:    &HomeView{},
        StudentView: &StudentView{},
    }
}

func (d *Dispatcher) Dispatch(request string) {
    if request == "student" {
        d.StudentView.Show()
    } else {
        d.HomeView.Show()
    }
}

type FrontController struct {
    Dispatcher *Dispatcher
}

func NewFrontController() *FrontController {
    return &FrontController{
        Dispatcher: NewDispatcher(),
    }
}

func (f *FrontController) isAuthenticUser() bool {
    fmt.Println("user is authenticated successfully")
    return true
}

func (f *FrontController) trackRequest(request string) {
    fmt.Println("Page requested: ", request)
}

func (f *FrontController) DispatherRequest(request string) {
    f.trackRequest(request)
    if f.isAuthenticUser() {
        f.Dispatcher.Dispatch(request)
    }
}

func main() {
    controller := NewFrontController()
    controller.DispatherRequest("home")
    controller.DispatherRequest("student")
}