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

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

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

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

  典型例子就是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 );
}
}

运行:

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

浅谈Java五大设计原则之责任链模式的更多相关文章

  1. 浅谈Java五大设计原则之观察者模式

    定义一下观察者模式: 观察者模式又叫  发布-订阅  模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象 将得到通知并自动更新(摘自Hand First). ...

  2. 浅谈Java五大设计原则之代理模式

    我们来定义一下  AOP(面向切面编程) 它是面向对象的一种补充或者是一种增强,它在这基础上增加了一些 而外的功能增强. 它可以在原有的行为不改变的前提,在这之前或者之后完成一些而外 的事情. 而AO ...

  3. java设计模式解析(11) Chain责任链模式

    设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...

  4. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

  5. Java进阶篇设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  6. Java设计模式(九)责任链模式 命令模式

    (十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...

  7. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  8. Java内功修炼系列一责任链模式

    在上一节的拦截器中提到,程序的设计者一般会用拦截器替替代动态代理,将动态代理的逻辑隐藏起来,而把拦截器接口提供给开发者,使开发者不需要关系动态代理的具体实现过程,但是有时候需要多个拦截器,而且拦截器之 ...

  9. java设计模式(五)责任链模式

    很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用    2 ...

随机推荐

  1. 使用laravel一分钟搭建CURD后台页面

    配置即一切 一切皆于需求,后台从0开始搭建,但是写了一两个页面后发现太多的是对单表的增删改查操作,于是就想到了,能不能做一个快速搭建的后台.想到一句话,配置即一切.如果一个CURD后台能只进行配置就自 ...

  2. 网页颜色分辨测试小游戏的js化辨别及优化

    相信大家都玩过一种网页游戏,通俗的可以叫颜色分辨测试游戏(这个名字对不对我也不知道,不要在意这些细节),也就是下面截图这个玩意,一看就明白:细细把玩过一段时间,作为一个一百米开外男女不分的弱视青年,每 ...

  3. Redis使用总结(2):Python接口

    安装redis-py sudo pip2 install redis 牛刀小试 redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量直接使用.如果需要另一个Redis实例(o ...

  4. Redis使用总结(1):基础使用

    Redis的安装及启动 安装 Ubuntu sudo apt-get install redis Mac sudo brew install redis Windows 不支持 启动 首先启动Redi ...

  5. 7z制作自解压安装包

    像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应 ...

  6. 怎么解析json串在.net中

    以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JObject jo = JObject.Parse(json); ...

  7. 15天玩转redis —— 第三篇 无敌的列表类型

     据说60%的人使用redis看重的是redis中的list类型,那这个list有什么用呢???不用我说大家都明白,做队列使用呗,为什么用它呢,很简单呗, 因为有了它我就不需要专门的MQ产品啦,比如说 ...

  8. The Amazing ProgressBar Control(转)

    好久没写博客了,今天就先转一篇,随后可以再写些~~~ 直接把原文粘过来,就不再进行翻译和个人说明了,因为效果很COOL~ The Amazing ProgressBar Control A progr ...

  9. Jetty 的工作原理以及与 Tomcat 的比较

    Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所 ...

  10. 微信公众平台关于fakeid和openid的解析

    今天在开发项目的时候遇到了个问题: 搞不清楚微信官方接口的fromusername(openid)和公众平台内每个粉丝所拥有的fakeid,于是在测试号中开始了对以上两项的研究,结果如下:   1.对 ...