zoukankan      html  css  js  c++  java
  • 浅谈Java五大设计原则之责任链模式

    首先我们得先定义一个责任链模式:

      责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中,

    由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个对象,

    一次类推,就形成了一个执行链。

      典型例子就是Tomcat中的过滤器,当配置了多个过滤器时,就会形成一条过滤链,客户端发起

    的请求会经过这条过滤链上的每一个过滤器,最终只有一个过滤器去处理这个请求。

    纯与不纯的责任链:

      1.纯的责任链是在整条链中,只有一个对象可以处理这个任务。不会处理完一半,再移送给另一个

    对象。

      2.在整条纯的责任链,必须有一个对象能够处理当前的任务。不可能出现一个任务没有一个对象去

    处理的情况。

      在实际的开发中,多数都会出现不纯的责任链。其实这是责任链模型的一种改变,是为了迎合业务的

    变化。

    先定义一个接口:

    package org.demo2;
    
    /**
     * Created by Administrator on 2016/11/23.
     */
    //定义一个接口
    public interface AbstractHandler {
        //接口的方法
        public String requestHandler(int money, HandlerChain chain);
    }
    

    在写两个类实现这个接口

    package org.demo2;
    
    /**
     * Created by Administrator on 2016/11/23.
     */
    //班委handler,实现了AbstractHandler
    public class QuadHandler implements AbstractHandler {
    
        //重写接口的方法
        @Override
        public String requestHandler(int money, HandlerChain chain) {
            //判断是否符合条件
            if ( money <= 50 ) {
                return "班委通过审核";
            }
            //如果不符合,则将该任务移送到下一个对象
            return chain.execute( money );
        }
    }
    
    package org.demo2;
    
    /**
     * Created by Administrator on 2016/11/23.
     */
    //老师handler,实现了AbstractHandler
    public class TeacherHandler implements AbstractHandler {
    
        //重写接口的方法
        @Override
        public String requestHandler(int money, HandlerChain chain) {
            //判断是否符合条件
            if ( money <= 200 ) {
                return "班主任通过审核";
            }
            //如果不符合,则将该任务移送到下一个对象
            return chain.execute( money );
        }
    }
    

    写一个执行链的类:

    package org.demo2;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * Created by Administrator on 2016/11/23.
     * 执行链管理者
     * 将链上的所有对象都放到此类中管理
     */
    public class HandlerChain {
        //这个集合存放所有的执行者
        private List<AbstractHandler> handlers = new ArrayList<>();
        //声明一个迭代器,用于遍历list集合
        private Iterator<AbstractHandler> iterator;
    
        //在实例化该对象时,将QuaHandler和TeacherHandler添加到集合中
        public HandlerChain() {
            //将对象添加到list集合中
            handlers.add( new QuadHandler() );
            handlers.add( new TeacherHandler() );
            //返回一个迭代器
            iterator = handlers.iterator();
        }
    
        //执行时遍历集合,调用每一个执行者
        public String execute( int money ) {
            //遍历list集合
            if ( iterator.hasNext() ) {
                //返回下一个Handler对象
                return iterator.next().requestHandler( money, this );
            }
            //若不存在,则返回null
            return null;
        }
    }
    

    最后写一个main方法:

    package org.demo2;
    
    /**
     * Created by Administrator on 2016/11/23.
     */
    public class Main {
        public static void main(String[] args) {
            //实例化HandlerChain对象
            HandlerChain chain = new HandlerChain();
            //执行execute方法,返回一个字符串
            String msg = chain.execute( 40 );
            System.out.println( msg );
        }
    }
    

    运行:

    若修改参数:

    package org.demo2;
    
    /**
     * Created by Administrator on 2016/11/23.
     */
    public class Main {
        public static void main(String[] args) {
            //实例化HandlerChain对象
            HandlerChain chain = new HandlerChain();
            //执行execute方法,返回一个字符串
         //将参数修改为160 String msg = chain.execute( 160 ); System.out.println( msg ); } }

    运行:

    ------------------------------------------------

  • 相关阅读:
    【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行
    【刷题】BZOJ 4650 [Noi2016]优秀的拆分
    【刷题】BZOJ 4566 [Haoi2016]找相同字符
    【刷题】BZOJ 3238 [Ahoi2013]差异
    微信公众号_订阅号_被动回复用户消息
    艺术模板 art-template-web
    AJAX_违反了同源策略_就是"跨域"——jsonp 和 cors
    Ajax_简介: 异步的 JS 和 XML_原生写 ajax 分析其原理_jquery_ajax_art-template
    Node.js_express_临时会话对象 session
    BOM 浏览器对象模型_XMLHttpRequest 对象
  • 原文地址:https://www.cnblogs.com/hmake/p/6095470.html
Copyright © 2011-2022 走看看