设计模式-前端控制器模式

时间: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里中常用,模式也很成熟了。