zoukankan      html  css  js  c++  java
  • java设计模式--责任链模式

    责任链模式:将能够处理同一类请求的对象连成一条链,如果不能处理则传递给链上的下一个对象。

    //请假对象
    public class QingjiaRequest {
        
        private String name;
        
        private int days;
        
        private String reason;
    
        public QingjiaRequest(String name, int days, String reason) {
            this.name = name;
            this.days = days;
            this.reason = reason;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getDays() {
            return days;
        }
    
        public void setDays(int days) {
            this.days = days;
        }
    
        public String getReason() {
            return reason;
        }
    
        public void setReason(String reason) {
            this.reason = reason;
        }
    
    }
    //抽象类
    public abstract class Leader {
        
        String name;
        
        Leader nextLeader;
    
        public Leader(String name) {
            this.name = name;
        }
    
        public void setNextLeader(Leader nextLeader) {
            this.nextLeader = nextLeader;
        }
        
        //设置责任链的处理对象(核心)
        public abstract void handleRequest(QingjiaRequest qingjiaRequest);
    
    }
    //主任
    public class Zhuren extends Leader{
    
        public Zhuren(String name){
            super(name);
        }
        
        
        public void handleRequest(QingjiaRequest qingjiaRequest) {
            if(qingjiaRequest.getDays()<3){
                System.out.println("员工请假小于3天");
                System.out.println("审批通过");
            }else{
                if(this.nextLeader!=null){
                    this.nextLeader.handleRequest(qingjiaRequest);
                }
            }
            
            
        }
    
    }
    //经理
    public class Manager extends Leader{
    
        public Manager(String name){
            super(name);
        }
        
        
        public void handleRequest(QingjiaRequest qingjiaRequest) {
            if(qingjiaRequest.getDays()<10&&qingjiaRequest.getDays()>3){
                System.out.println("经理审批通过");
            }else{
                 //经理处理后的逻辑
            }
            
            
        }
    
    }
    public static void main(String[] args) {
            
            QingjiaRequest qingjiaRequest = new QingjiaRequest("张三", 2, "请假");
            //QingjiaRequest qingjiaRequest1 = new QingjiaRequest("张三", 5, "请假");
            Leader a = new Zhuren("张主任");
            Leader b = new Manager("王经理");
    //可以用一个容器对象责任链对象进行一些封装 a.setNextLeader(b);
    //开始请假 a.handleRequest(qingjiaRequest); }

    应用场景:try catch,javascript 冒泡,servlet filter,struts2 拦截器

    模仿 JavaWeb 中的 Filter,可以对其思路有个很好的把握
    1.Filter

    package com.cun.filters;

    import com.cun.main.FilterChain;
    import com.cun.main.Request;
    import com.cun.main.Response;

    public interface Filter {
        void doFilter(Request request, Response response, FilterChain chain);
    }

     

    2.FirstFilter

    package com.cun.filters;

    import com.cun.main.FilterChain;
    import com.cun.main.Request;
    import com.cun.main.Response;

    public class FirstFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {

            request.doSomething(this.getClass().getName());

            // 先执行所有request再倒序执行所有response
            chain.doFilter(request, response, chain);

            response.doSomething(this.getClass().getName());
        }
    }



    3.SecondFilter

    package com.cun.filters;

    import com.cun.main.FilterChain;
    import com.cun.main.Request;
    import com.cun.main.Response;

    public class SecondFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            request.doSomething(this.getClass().getName());
            chain.doFilter(request, response, chain);
            response.doSomething(this.getClass().getName());
        }
    }

      

    3.ThirdFilter

    package com.cun.filters;

    import com.cun.main.FilterChain;
    import com.cun.main.Request;
    import com.cun.main.Response;

    public class ThirdFilter implements Filter {
        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            request.doSomething(this.getClass().getName());
            chain.doFilter(request, response, chain);
            response.doSomething(this.getClass().getName());
        }
    }



    4.Request

    package com.cun.main;

    public class Request {
        public void doSomething(String str) {
            System.out.println("Request ---> " + str);
        }
    }



    5.Response

    package com.cun.main;

    public class Response {
        public void doSomething(String str) {
            System.out.println("Response ---> " + str);
        }
    }

      
    6.FilterChain

    package com.cun.main;


    import com.cun.filters.Filter;

    import java.util.ArrayList;
    import java.util.List;

    public class FilterChain implements Filter {

        private List<Filter> filters = new ArrayList<Filter>();

        private int index = 0;

        // 链式调用
        public FilterChain addFilter(Filter filter) {
            this.filters.add(filter);
            return this;
        }

        @Override
        public void doFilter(Request request, Response response, FilterChain chain) {
            if (index == filters.size()) {
                return;
            }
            Filter filter = filters.get(index);
            index++;
            filter.doFilter(request, response, chain);
        }
    }

       

    7.FilterTest 测试

    package com.cun.main;

    import com.cun.filters.FirstFilter;
    import com.cun.filters.SecondFilter;
    import com.cun.filters.ThirdFilter;
    import org.junit.Test;

    public class FilterTest {

        @Test
        public void Test(){
            FilterChain filterChain = new FilterChain();
            filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter()).addFilter(new ThirdFilter());
            filterChain.doFilter(new Request(),new Response(),filterChain);
        }

    }




  • 相关阅读:
    常用 SQL Server 规范集锦
    让Git忽略所有obj和bin目录的同步
    Sql server 存储过程基础语法
    nginx 站点代理,负载均衡
    CentOS7.0安装Nginx-1.12.0
    CentOS7安装GNOME可视化界面和如何配置IP地址
    开发工具资料集合
    NOIP2018总结反思
    NOIP2018考试报告
    STL基础用法
  • 原文地址:https://www.cnblogs.com/jentary/p/5922096.html
Copyright © 2011-2022 走看看