精华内容
下载资源
问答
  • 前端控制器模式

    2019-03-09 16:42:04
    前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。以下...
  • 上文(设计模式-数据访问对象模式):... 背景 ... 前端控制器模式是什么? ...前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认

    上文(设计模式-数据访问对象模式):https://blog.csdn.net/qq_16498553/article/details/107010213


    背景

    记得在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里中常用,模式也很成熟了。

    展开全文
  • Java前端控制器模式

    2017-07-06 14:24:16
    Java前端控制器模式 前端控制器设计模式用于提供集中式请求处理机制,以便所有请求将由单个处理程序处理。此处理程序可以执行请求的身份验证/授权/记录或跟踪,然后将请求传递到相应的处理程序。 以下是这种...
    Java前端控制器模式


    前端控制器设计模式用于提供集中式请求处理机制,以便所有请求将由单个处理程序处理。此处理程序可以执行请求的身份验证/授权/记录或跟踪,然后将请求传递到相应的处理程序。 以下是这种类型的设计模式的实体。


    前端控制器 - 用于处理应用程序(基于Web或基于桌面)的各种请求的单个处理程序。
    分发器 - 前端控制器可以使用可以将请求分派到相应的特定处理器的分派器对象。
    视图 - 视图是进行请求的对象。
    实现实例


    在这个实现实例中,将创建一个FrontController和Dispatcher作为前台控制器和相应的调度程序。 HomeView和StudentView代表各种视图,请求可以到前端的控制器中。


    FrontControllerPatternDemo这是一个演示类,将使用FrontController来演示前控制器设计模式。








    第1步


    创建两个视图,其代码如下 -
    HomeView.java




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


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


    创建分派调度程序,其代码如下 -
    Dispatcher.java




    public class Dispatcher {
       private StudentView studentView;
       private HomeView homeView;


       public Dispatcher(){
          studentView = new StudentView();
          homeView = new HomeView();
       }


       public void dispatch(String request){
          if(request.equalsIgnoreCase("STUDENT")){
             studentView.show();
          }
          else{
             homeView.show();
          }    
       }
    }
    Java
    第3步


    创建前端控制器 - FrontController,其代码如下 -
    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);
          }    
       }
    }
    Java
    第4步


    使用FrontController来演示前端控制器设计模式。


    FrontControllerPatternDemo.java




    public class FrontControllerPatternDemo {
       public static void main(String[] args) {


          FrontController frontController = new FrontController();
          frontController.dispatchRequest("HOME");
          frontController.dispatchRequest("STUDENT");
       }
    }
    Java
    第5步


    验证输出,执行上面的代码得到以下结果 -


    Page requested: HOME
    User is authenticated successfully.
    Displaying Home Page
    Page requested: STUDENT
    User is authenticated successfully.
    Displaying Student Page
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,901
精华内容 760
关键字:

前端控制器模式