前端控制器设计模式意味着对应用程序中资源的所有请求都将由单个处理程序处理,然后分派到该类型请求的适当处理程序。前端控制器可能会使用其他助手来实现调度机制。
UML 图前端控制器设计模式
设计组件
- 控制器:控制器是处理系统中所有请求的初始接触点。控制器可以委托助手完成用户的身份验证和授权或启动联系人检索。
- 视图:视图代表并向客户端显示信息。视图从模型中检索信息。帮助程序通过封装和调整用于显示的底层数据模型来支持视图。
- 调度器:调度器负责视图管理和导航,管理下一个呈现给用户的视图的选择,并提供对该资源进行矢量控制的机制。
- 助手:助手负责帮助视图或控制器完成其处理。因此,助手有许多职责,包括收集视图所需的数据和存储这个中间模型,在这种情况下,助手有时被称为值 bean。
让我们看一个前端控制器设计模式的例子。
class TeacherView
{
public void display()
{
System.out.println("Teacher View");
}
}
class StudentView
{
public void display()
{
System.out.println("Student View");
}
}
class Dispatching
{
private StudentView studentView;
private TeacherView teacherView;
public Dispatching()
{
studentView = new StudentView();
teacherView = new TeacherView();
}
public void dispatch(String request)
{
if(request.equalsIgnoreCase("Student"))
{
studentView.display();
}
else
{
teacherView.display();
}
}
}
class FrontController
{
private Dispatching Dispatching;
public FrontController()
{
Dispatching = new Dispatching();
}
private boolean isAuthenticUser()
{
System.out.println("Authentication successful.");
return true;
}
private void trackRequest(String request)
{
System.out.println("Requested View: " + request);
}
public void dispatchRequest(String request)
{
trackRequest(request);
if(isAuthenticUser())
{
Dispatching.dispatch(request);
}
}
}
class FrontControllerPattern
{
public static void main(String[] args)
{
FrontController frontController = new FrontController();
frontController.dispatchRequest("Teacher");
frontController.dispatchRequest("Student");
}
}
输出:
Requested View: Teacher
Authentication successful.
Teacher View
Requested View: Student
Authentication successful.
Student View
好处 :
- 集中控制:前端控制器处理对 Web 应用程序的所有请求。这种避免使用多个控制器的集中控制的实现对于实施应用程序范围的策略(例如用户跟踪和安全)是可取的。
- 线程安全:接收新请求时会出现一个新的命令对象,并且该命令对象并不意味着是线程安全的。因此,它在命令类中是安全的。尽管在收集线程问题时不能保证安全,但使用该命令的代码仍然是线程安全的。
缺点:
- 使用前端控制器无法扩展应用程序。
- 如果您唯一地处理单个请求,则性能会更好。