设计模式-前端控制器模式
时间:2022-07-25
本文章向大家介绍设计模式-前端控制器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
记得在java里面写过html代码的同学,痛苦大家都知道,想拓展,同样一份代码维护性和继承性可以说真的把java三种特性彻底搞没了,而且,还他xxx难维护。
前端控制器模式是什么?
前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下是这种设计模式的实体。
角色:
前端控制器(Front Controller):处理应用程序所有类型请求的单个处理程序,应用程序可以是基于 web 的应用程序,也可以是基于桌面的应用程序。
调度器(Dispatcher):前端控制器可能使用一个调度器对象来调度请求到相应的具体处理程序。
视图(View):视图是为请求而创建的对象。
优点:
统一管理:统一调度器统一将请求统一拦截和记录。
缺点:
转发器故障将引发整个系统瘫痪。
前端控制器模式可以干嘛?
主要解决了将用户的请求统一管理,然后进行转发,通过转发获取指定的资源,并且可以通过这个控制器来进行日志的记录,权限的鉴定,使系统有一个统一的入口。
个人理解:
比如:你想到家里拿东西,只有一个门,这个门你有钥匙才可以进,并且家人知道你进来了。
前端控制器模式类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/6/29 10:09
* @Description:抽象的视图
*/
public abstract class Grade {
public abstract void show();
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:11
* @Description:成绩良 view
*/
public class Good extends Grade {
private static Good good = new Good();
private Good(){
}
public static Good getInstance(){
return good;
}
@Override
public void show() {
System.out.println("成绩良好");
}
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:10
* @Description:view
*/
public class Excellent extends Grade {
public static Excellent excellent = new Excellent();
private Excellent(){
}
public static Excellent getInstance(){
return excellent;
}
@Override
public void show() {
System.out.println("成绩优秀。");
}
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:12
* @Description:成绩不及格(view)
*/
public class Bad extends Grade {
private static Bad bad = new Bad();
private void Bad(){
}
public static Bad getInstance(){
return bad;
}
@Override
public void show() {
System.out.println("成绩不及格");
}
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:11
* @Description:
*/
public class General extends Grade {
private static General general = new General();
@Override
public void show() {
System.out.println("成绩一般");
}
private General(){
}
public static General getInstance(){
return general;
}
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:12
* @Description:调度器
*/
public class Dispatcher {
public void dispatch(int grade){
if(grade<60){
Bad.getInstance().show();
}else if(grade>=60 && grade<70){
General.getInstance().show();
}else if(grade>=70 && grade<80){
Good.getInstance().show();
}else{
Excellent.getInstance().show();
}
}
}
/**
* @Auther: csh
* @Date: 2020/6/29 10:40
* @Description:控制器
*/
public class GradeController {
private Dispatcher dispatcher;
public GradeController(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
private void log(int grade){
System.out.println("请求的成绩是:"+grade);
}
private Boolean isAuthenticUser(){
System.out.println("默认通过");
return true;
}
public void dispatcherRequest(int grade){
//打印日志
log(grade);
//对用户进行鉴权
if(isAuthenticUser()){
dispatcher.dispatch(grade);
}
}
}
结果
请求的成绩是:1
默认通过
成绩不及格
请求的成绩是:10
默认通过
成绩不及格
请求的成绩是:100
默认通过
成绩优秀。
请求的成绩是:80
默认通过
成绩优秀。
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
前端控制器模式,通过用户请求控制器,然后调度器进行统一的拦截和记录及请求。当然调度器角色有点类似于门面模式中的统一面对控制器的请求思想,一但这个调度器发生异常,那整个系统的请求都可能瘫痪,有点类似有家附近的变压器,一但出问题,整个村或者发几条街都没电了。不过这个一般都在mvc里中常用,模式也很成熟了。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用机器学习预测收益
- 一种基于深度学习的低成本细胞生物学研究方法
- 从零搭建Spring Boot脚手架(2):增加通用的功能
- Qt官方示例-K线图
- 一个快速构造GAN的教程:如何用pytorch构造DCGAN
- 从0到1开发测试平台(八)后端服务添加lombok第三方类库
- 【CSS】470- 是时候开始用 CSS 自定义属性了
- 一个安卓App,如何成为DuerOS 上的技能应用呢?
- 什么是SPU、SKU、SKC、ARPU
- C++判断类型的模板
- 强化学习/增强学习/再励学习介绍 | 深度学习 | 干货分享 | 解读技术
- Spring Security 初始化流程梳理
- 聊聊dubbo-go的kubernetesRegistry
- QMake复制文件/目录方法
- 计算FPS小例子