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

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

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

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

  典型例子就是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. nginx+uwsgi+django+celery+supervisord环境部署

    前言 很久没更博客了,最近新写了一个小项目,后边有时间把一些心得放上来,先把环境的部署方式整理出来. 部署过程 先将环境的python升级为2.7 保证有pip 安装了nginx并配置 vim /Da ...

  2. .NET Core中使用Razor模板引擎

    一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Razor.NVeocity.VTemplate.虽然所有的模板系统都具有一些共同特征,但 Ra ...

  3. MySQL 复制介绍及搭建

    MySQL复制介绍 MySQL复制就是一台MySQL服务器(slave)从另一台MySQL服务器(master)进行日志的复制然后再解析日志并应用到自身,类似Oracle中的Data Guard. M ...

  4. MVC中几种常用ActionResult

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  5. mysql中,ENCODE警告---Warning Code : 1287

    mysql中,ENCODE警告 共 1 行受到影响, 1 个警告 执行耗时 : 0.072 sec传送时间 : 0.001 sec总耗时 : 0.073 sec Warning Code : 1287 ...

  6. Pydev Debugger not working with breakpoints

    I have a simple test module: print("fish")print("sticks")It runs pretty fast as ...

  7. 总结一下工作中用到的Mybatis业务逻辑

    1.简单说明. MyBatis 可以使用简单的XML 或注解用于配置和原始映射,将接口和 Java 的 POJO( Plain Old Java Objects,普通的Java 对象)映射成数据库中的 ...

  8. Java分布式开发

    分布式概念的引入是基于性能的提升,应用的可靠性而提出的.所谓Java分布式,即是在使用Java语言进行企业级应用开发的过程中,采用分布式技术解决业务逻辑的高并发.高可用性的一些架构设计方案. 1. R ...

  9. 代码设置Shape和Selector

    开发中经常需要使用Shape和Selector,如果每个都用xml设置的话,会占用apk大小,同时命名多了也会混乱,使用代码来设置会方便很多. 需要用到2个类:GradientDrawable和Sta ...

  10. socket.io,环境搭建 & Hello world

    原文:http://www.cnblogs.com/xiezhengcai/p/3955827.html socket.io 一个与服务器实时通信的工具,它与原生的webSocket相比,具有更可靠. ...