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

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

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

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

  典型例子就是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. 基于HTML5 WebGL实现3D飞机叶轮旋转

    在上一篇<基于HT for Web矢量实现2D叶轮旋转>中讲述了叶轮旋转在2D拓扑上的应用,今天我们就来讲讲叶轮旋转在3D上的应用. 在3D拓扑上可以创建各种各样的图元,在HT for W ...

  2. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要四

    又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢! 十八. Lambda 1.Lambda表达式:匿名方法的另一种表现形式,它可以包含表达式和语句,且用于创建委托 ...

  3. 【转载】那些年我们一起清除过的浮动demo

    返回文章:那些年我们一起清除过的浮动 闭合浮动 与 清除浮动 的区别 .main:很抱歉,现代浏览器中我没能把warp撑高(float:left) .side:我也浮动了(float:left) .f ...

  4. javascript设计模式实践之策略模式--输入验证

    策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...

  5. 使用MVVM-Sidekick开发Universal App(二)

    上一篇文章已经建立了基本的实体类,并且搞定了多语言的问题,以后在app里用字符串的时候就可以从资源文件中取了.现在继续进行. 一.添加一个页面 CurrencyExchanger首页是一个货币兑换的列 ...

  6. 微信公众号入门学习1_使用C#,ASP.NET APIController如何公众号接入服务器并启动开发者模式

    前言:  本文是以微信公众号中的订阅号(个人)来进行简单介绍,本人也是刚刚开始学习,有不足之处,欢迎批评指正. 先粘贴2个帮助链接: 入门指引:http://mp.weixin.qq.com/wiki ...

  7. JS通过身份证号码获取出生年月日

    这里我们讲述一下关于jq根据身份证号码计算出生日期.年龄.性别,有需要的同学可参考一下.    代码如下 复制代码 //获取输入身份证号码 var UUserCard = $("#UUser ...

  8. 简单在android adb root方法

    在有些android手机上使用adb root希望获取root权限时出现如下提示信息:adbd cannot run as root in production builds.此时提升root权限的方 ...

  9. 通过angularJS官方案例快速入门

    官方案例-angular-phonecat angularJS官方提供了一个官方案例给大家进行循序渐进的学习,但是如果之前没有接触过node.js以及git的同学这个案例拿着也无从下手-这里就介绍一下 ...

  10. PLSQL怎样导出oracle表结构和数据

    1.导出表结构和数据方式1.tools->export user objects是导出表结构 tools ->export user object 选择选项,导出.sql文件 说明:导出的 ...