浅谈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 );
}
}
运行:
------------------------------------------------
浅谈Java五大设计原则之责任链模式的更多相关文章
- 浅谈Java五大设计原则之观察者模式
定义一下观察者模式: 观察者模式又叫 发布-订阅 模式,定义的两个对象之间是一种一对多的强依赖关系,当一个对象的状态发生改变,所有依赖它的对象 将得到通知并自动更新(摘自Hand First). ...
- 浅谈Java五大设计原则之代理模式
我们来定义一下 AOP(面向切面编程) 它是面向对象的一种补充或者是一种增强,它在这基础上增加了一些 而外的功能增强. 它可以在原有的行为不改变的前提,在这之前或者之后完成一些而外 的事情. 而AO ...
- java设计模式解析(11) Chain责任链模式
设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析(4) ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- Java设计模式(九)责任链模式 命令模式
(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化.这种设计能够使得系统更加 ...
- Java描述设计模式(15):责任链模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...
- Java内功修炼系列一责任链模式
在上一节的拦截器中提到,程序的设计者一般会用拦截器替替代动态代理,将动态代理的逻辑隐藏起来,而把拦截器接口提供给开发者,使开发者不需要关系动态代理的具体实现过程,但是有时候需要多个拦截器,而且拦截器之 ...
- java设计模式(五)责任链模式
很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用 2 ...
随机推荐
- 基于HTML5 WebGL实现3D飞机叶轮旋转
在上一篇<基于HT for Web矢量实现2D叶轮旋转>中讲述了叶轮旋转在2D拓扑上的应用,今天我们就来讲讲叶轮旋转在3D上的应用. 在3D拓扑上可以创建各种各样的图元,在HT for W ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要四
又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢! 十八. Lambda 1.Lambda表达式:匿名方法的另一种表现形式,它可以包含表达式和语句,且用于创建委托 ...
- 【转载】那些年我们一起清除过的浮动demo
返回文章:那些年我们一起清除过的浮动 闭合浮动 与 清除浮动 的区别 .main:很抱歉,现代浏览器中我没能把warp撑高(float:left) .side:我也浮动了(float:left) .f ...
- javascript设计模式实践之策略模式--输入验证
策略模式中的策略就是一种算法或者业务规则,将这些策略作为函数进行封装,并向外提供统一的调用执行. 先定义一个简单的输入表单: <!DOCTYPE html> <html> &l ...
- 使用MVVM-Sidekick开发Universal App(二)
上一篇文章已经建立了基本的实体类,并且搞定了多语言的问题,以后在app里用字符串的时候就可以从资源文件中取了.现在继续进行. 一.添加一个页面 CurrencyExchanger首页是一个货币兑换的列 ...
- 微信公众号入门学习1_使用C#,ASP.NET APIController如何公众号接入服务器并启动开发者模式
前言: 本文是以微信公众号中的订阅号(个人)来进行简单介绍,本人也是刚刚开始学习,有不足之处,欢迎批评指正. 先粘贴2个帮助链接: 入门指引:http://mp.weixin.qq.com/wiki ...
- JS通过身份证号码获取出生年月日
这里我们讲述一下关于jq根据身份证号码计算出生日期.年龄.性别,有需要的同学可参考一下. 代码如下 复制代码 //获取输入身份证号码 var UUserCard = $("#UUser ...
- 简单在android adb root方法
在有些android手机上使用adb root希望获取root权限时出现如下提示信息:adbd cannot run as root in production builds.此时提升root权限的方 ...
- 通过angularJS官方案例快速入门
官方案例-angular-phonecat angularJS官方提供了一个官方案例给大家进行循序渐进的学习,但是如果之前没有接触过node.js以及git的同学这个案例拿着也无从下手-这里就介绍一下 ...
- PLSQL怎样导出oracle表结构和数据
1.导出表结构和数据方式1.tools->export user objects是导出表结构 tools ->export user object 选择选项,导出.sql文件 说明:导出的 ...