前端控制器模式


前端控制器模式用于提供集中的请求处理机制,以便所有请求将由单个处理程序处理。此处理程序可以执行身份验证 / 授权 / 日志记录或跟踪请求,然后将请求传递给相应的处理程序。
此模式的最佳示例是Spring MVC DispatcherServlet,它是一个前端控制器,根据映射处理所有用户请求。

问题
您需要一个集中访问点来处理表示层请求。

动因

  • 您希望避免重复的控制逻辑。
  • 您希望将公共逻辑应用于多个请求。
  • 您希望将系统处理逻辑与视图分开。
  • 您希望将受控访问点集中到系统中。

解决方案
使用前端控制器作为处理所有相关请求的初始联系点。前端控制器集中控制可能被复制的逻辑,并管理关键的请求处理活动。

说明
简单来说
前端控制器设计模式用于提供集中的请求处理机制,以便所有请求由单个处理程序处理。此处理程序可以执行身份验证/授权/日志记录或跟踪请求,然后将请求传递给相应的处理程序。
维基百科说
前端控制器软件设计模式列在多个模式目录中,并与Web应用程序的设计相关。它是“处理网站所有请求的控制器”,这是Web应用程序开发人员在没有代码冗余的情况下实现灵活性和重用的有用结构。

结构
类图

序列图

参与者和责任
FrontController -  FrontController是处理系统中请求的初始联系点。它委托给ApplicationController来执行操作和查看管理。
ApplicationController -  ApplicationController负责操作和视图管理,包括定位和路由到将为请求提供服务的特定操作,以及查找和分派到适当的视图。
Command  -  命令执行处理请求的操作。
View-  视图表示返回给客户端的显示。

实施
第1步:  创建视图 - HomeView,StudentView,ErrorView,DashboardView java类。

public class HomeView {
    public void show() {
        System.out.println("Displaying Home Page");
    }
}

public class StudentView {
    public void show() {
        System.out.println(
"Displaying Student Page");
    }
}

public class ErrorView {
    public void show() {
        System.out.println(
"Displaying Error Page");
    }
}

public class DashboadView {
    public void show() {
        System.out.println(
"Displaying Dashboad Page");
    }
}

第2步:  创建Dispatcher - Dispatcher.java

public class Dispatcher {
    private StudentView studentView;
    private HomeView homeView;
    private DashboardView dashboardView;
    private ErrorView errorView;

    public Dispatcher() {
        studentView = new StudentView();
        homeView = new HomeView();
        dashboardView = new DashboardView();
        errorView = new ErrorView();
    }

    public void dispatch(String request) {
        if (request.equalsIgnoreCase("STUDENT")) {
            studentView.show();
        }
        if (request.equalsIgnoreCase(
"DASHBOARD")) {
            dashboardView.show();
        }
        if (request.equalsIgnoreCase(
"HOME")) {
            homeView.show();
        } else {
            errorView.show();
        }
    }
}

第3步:  创建Front Controller - FrontController.java

public class FrontController {

    private Dispatcher dispatcher;

    public FrontController() {
        dispatcher = new Dispatcher();
    }

    private boolean isAuthenticUser() {
        System.out.println("User is authenticated successfully.");
        return true;
    }

    private void trackRequest(String request) {
        System.out.println(
"Page requested: " + request);
    }

    public void dispatchRequest(String request) {
       
//log each request
        trackRequest(request);

       
//authenticate the user
        if (isAuthenticUser()) {
            dispatcher.dispatch(request);
        }
    }
}

第4步:  使用前端控制器演示前端控制器设计模式 - FrontControllerPatternDemo.java

public class FrontControllerPatternDemo {
   public static void main(String[] args) {
   
      FrontController frontController = new FrontController();
      frontController.dispatchRequest("HOME");
      frontController.dispatchRequest(
"STUDENT");
      frontController.dispatchRequest(
"DASHBOARD");
      frontController.dispatchRequest(
"ERROR");
   }
}


后果

  • 集中控制
  • 提高可管理性
  • 提高可重用性
  • 改善角色分离

适用场景

  • 您希望在单个位置封装常见请求处理功能。
  • 您希望实现动态请求处理,即在不修改代码的情况下更改路由。
  • 使Web服务器配置可移植,您只需要以特定方式注册处理程序Web服务器。