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

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

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

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

  典型例子就是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. 【Swift学习】Swift编程之旅(三)

    元组(tuples) tuples是将多个单一的值组合为一个复合的值.它可以包含任何类型的值,而不需要都是相同类型. 一.元组的创建 1. let http404error = (,"NOT ...

  2. 【视频处理】YUV格式说明

    YUV,是一种颜色编码方法,Y表示明亮度(Luminance.Luma),U和V则是色度.浓度(Chrominance.Chroma). YUV,Y`UV,YCbCr,YPbPr等都可以称为YUV,彼 ...

  3. c# 中基类变量指向派生类对象的实例化

    这一篇文章转载自:http://www.xuebuyuan.com/390279.html 我对这篇文章进行了一一的验证,确实是这样子的,也明白了很多东西,觉得很有用,转载过来希望能够帮助大家. 1. ...

  4. 一道java算法题分析

    最近在面试中遇到这样的一道算法题:       求100!的结果的各位数之和为多少?       如:5!=5*4*3*2*1=120,那么他们的和为1+2+0=3这道题不算难,不过倒是注意的细节也有 ...

  5. C#控制台程序的参数解析类库 CommandLine简单使用说明

    前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是必选的,或者有些参数中间需要有空格比如时间“2016-05-18 ...

  6. 历史疑团之EJB

    在学习Sping框架的过程中,看到过很多次关于EJB的批判.使用了SpringMVC但是并没有真性情般体会到它的优点,所以有必要对传统的Java Bean和EJB来做一些了解,无奈百度搜了很多知识,还 ...

  7. PhantomJS快速入门

    本文简要介绍了PhantomJS的相关基础知识点,主要包括PhantomJS的介绍.下载与安装.HelloWorld程序.核心模块介绍等.由于鄙人才疏学浅,难免有疏漏之处,欢迎指正交流. 1.Phan ...

  8. synchronized的实现原理-java并发编程的艺术读书笔记

    1.synchronized实现同步的基础 Java中的每个对象都是可以作为锁,具体有3种表现. 1.对于普通同步方法,锁是当前实例对象. 2.对于静态同步方法,锁是当前类的Class对象. 3.对于 ...

  9. Exif.js 读取图像的元数据

    Exif.js 提供了 JavaScript 读取图像的原始数据的功能扩展,例如:拍照方向.相机设备型号.拍摄时间.ISO 感光度.GPS 地理位置等数据. 注意事项: EXIF 数据主要来自拍摄的照 ...

  10. Gogs - 基于 Go 语言的自助 Git 服务

    Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务.Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...