设计模式-前端控制器模式
时间: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里中常用,模式也很成熟了。
- JavaWeb21-基础加强(注解;代理;类加载器;泛型反射
- MySQL迁移文件的小问题(r8笔记第18天)
- SpringMVC学习第一天
- 最近的几个技术问题总结和答疑 (r8笔记第19天)
- Hibernate_day04总结
- Hibernate_day03总结
- 服务器进程异常的原因分析(第二篇)(r8笔记第16天)
- 最近处理的几个小问题_20160311 (r8笔记第35天)
- Hibernate_day02总结
- Hibernate_day01总结
- ADG备库批量查询失败的原因分析(r8笔记第33天)
- 通过外部表改进一个繁琐的大查询 (r8笔记第32天)
- 一个简单的bigfile tablespace无法扩展的案例处理 (r8笔记第31天)
- 测试环境的迁移式升级和数据整合(r8笔记第27天)
- 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 数组属性和方法
- MySQL8功能详解——Common table expression (CTE)
- 游戏数据分析
- MySQL8功能详解——隐藏索引
- python 操作excel(附案例)
- 如何在 Spring Boot 中 读写数据
- MyBatis 多表操作
- 从0打造wordpress插件wp2oc fileshare (1) – 将wp存储后端做进owncloud
- Python 爬虫保存图片
- 抛物线法、牛顿法、弦截法求根实例
- org.springframework.web.client.ResourceAccessException: I/O error on POST request....
- 升级MySQL InnoDB Cluster的元数据
- 数据分析项目-数据分析岗位近况分析
- Eureka 的服务发现 Discovery 简单配置
- python自动化之JS处理滚动条
- Docker 中启动 ZooKeeper