《java设计模式》之责任链模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:

  责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。


在以下条件下可考虑使用Chain of Responsibility:
1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3 可处理一个请求的对象集合应该被动态指定。

 


一个简单的例子:

 1 abstract class Handler {
 2 
 3     private Handler nextHandler;
 4 
 5     public Handler getNextHandler() {
 6         return nextHandler;
 7     }
 8 
 9     public void setNextHandler(Handler nextHandler) {
10         this.nextHandler = nextHandler;
11     }
12 
13     public abstract void doHandler();
14 
15 }
16 
17 class ConcreteHandler extends Handler {
18 
19     @Override
20     public void doHandler() {
21 
22         if (getNextHandler() != null) {
23 
24             System.out.println("还有责任链");
25             getNextHandler().doHandler();
26         } else {
27 
28             System.out.println("我自己处理" + toString());
29         }
30 
31     }
32 }

 既然为设计模式,必然有其鲜明代码的主体框架,我们来分析下

首先定义一个抽象的处理角色Handler ,其次是具体实现类ConcreteHandler ,在ConcreteHandler 我们通过getNextHandler()来判断是否还有下一个责任链,如果有,则继续

传递下去,调用getNextHandler().doHandler()来实现。

分析了简单的责任链模式的代码框架之后,我们接下来给代码加点实际的功能,举个很简单的例子,就是报销流程,项目经理<部门经理<总经理

其中项目经理报销额度不能大于500,则部门经理的报销额度是不大于1000,超过1000则需要总经理审核

 1 abstract class ConsumeHandler {
 2 
 3     private ConsumeHandler nextHandler;
 4 
 5     public ConsumeHandler getNextHandler() {
 6         return nextHandler;
 7     }
 8 
 9     public void setNextHandler(ConsumeHandler nextHandler) {
10         this.nextHandler = nextHandler;
11     }
12 
13     /** user申请人 free报销费用 */
14     public abstract void doHandler(String user, double free);
15 
16 }
17 //项目经理
18 class ProjectHandler extends ConsumeHandler {
19 
20     @Override
21     public void doHandler(String user, double free) {
22         if (free < 500) {
23 
24             if (user.equals("lwx")) {
25                 System.out.println("给予报销:" + free);
26             } else {
27                 System.out.println("报销不通过");
28             }
29 
30         } else {
31             if (getNextHandler() != null) {
32 
33                 getNextHandler().doHandler(user, free);
34             }
35         }
36 
37     }
38 }
39 //部门经理
40 class DeptHandler extends ConsumeHandler {
41     
42     @Override
43     public void doHandler(String user, double free) {
44         if (free < 1000) {
45             
46             if (user.equals("zy")) {
47                 System.out.println("给予报销:" + free);
48             } else {
49                 System.out.println("报销不通过");
50             }
51             
52         } else {
53             if (getNextHandler() != null) {
54                 
55                 getNextHandler().doHandler(user, free);
56             }
57         }
58         
59     }
60 }
61 //总经理
62 class GeneralHandler extends ConsumeHandler {
63     
64     @Override
65     public void doHandler(String user, double free) {
66         if (free >=1000) {
67             
68             if (user.equals("lwxzy")) {
69                 System.out.println("给予报销:" + free);
70             } else {
71                 System.out.println("报销不通过");
72             }
73             
74         } else {
75             if (getNextHandler() != null) {
76                 
77                 getNextHandler().doHandler(user, free);
78             }
79         }
80         
81     }
82 }

测试下

 1 public static void main(String[] args) {
 2 
 3         /*ConcreteHandler handler1 = new ConcreteHandler();
 4         ConcreteHandler handler2 = new ConcreteHandler();
 5         handler1.setNextHandler(handler2);
 6         handler1.doHandler();*/
 7         
 8         ProjectHandler projectHandler =new ProjectHandler();
 9         DeptHandler deptHandler =new DeptHandler();
10         GeneralHandler generalHandler =new GeneralHandler();
11         projectHandler.setNextHandler(deptHandler);
12         deptHandler.setNextHandler(generalHandler);
13         projectHandler.doHandler("lwx", 450);
14         projectHandler.doHandler("lwx", 600);
15         projectHandler.doHandler("zy", 600);
16         projectHandler.doHandler("zy", 1500);
17         projectHandler.doHandler("lwxzy", 1500);
18     }

执行结果

给予报销:450.0
报销不通过
给予报销:600.0
报销不通过
给予报销:1500.0

拓展联想:模拟实现servlet过滤器中字符和登陆过滤器的实现

关于tomcat中责任链的使用:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

 

 

 

 

转载于:https://www.cnblogs.com/draem0507/p/3784130.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/264758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解杀毒软件技术的意义 脱壳、虚拟、启发式介绍

如果生命是一种执着的力量&#xff0c;那么总有一种力量&#xff0c;比生命更加执着&#xff0c;就是死亡&#xff01;当你去深刻思考“死亡”这两个字的含义&#xff0c;用心去感受生命的来临与离去&#xff0c;更或许有的人&#xff0c;需要在他弥留之际&#xff0c;才能真正…

gb酱油和gbt酱油哪个好_都是酱油,生抽好还是味极鲜好?老板:两者差别很大,别买错了...

导读&#xff1a;都是酱油&#xff0c;生抽好还是味极鲜好&#xff1f;老板&#xff1a;两者差别很大&#xff0c;别买错了一道美食的完成不只是依赖掌厨的高超技艺&#xff0c;还与炒制的锅具、所用的调料等有关。其中最重要的就是调料&#xff0c;有了调料的辅助&#xff0c;…

C#连接基于Java开发IM——Openfire

Openfire简介 Openfire 是开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器。Openfire的效率很高&#xff0c;单台服务器可支持上万并发用户。   Server和Client端的通信都用xml文档的形式进行通信。 但是Openfire是Java语言写的&#xff0c;对…

数字万用表的使用

参考&#xff1a;连3岁小孩子都能看懂的万用表使用方法 地址&#xff1a;https://www.bilibili.com/video/BV1Gx411z7x2?p1&vd_sourcecc0e43b449de7e8663ca1f89dd5fea7d 目录万用表外观测量电阻测量通断/二极管测量电容测量温度测量电流测量电压测量三极管万用表外观 测量…

程序员讨论 《黑客帝国》 (三) 情感

人总会与人比较&#xff0c;找出自己拥有而别人没有的东西&#xff0c;从而建立起自信心。早期机器就已经在记忆和运算能力上超越人类&#xff0c;于是人类嘲笑机器没有智慧&#xff0c;突然有一天机器出现了智慧&#xff0c;能解决复杂问题&#xff0c;学会“骗人”了。人类傻…

在GridView开头插入自动编号的方法

网上看了很多方法&#xff0c;发现都是照抄别人&#xff0c;而且&#xff0c;都是把第一列替换掉了&#xff0c;往往不是我们的理想结果。经过本人的实践&#xff0c;下面方法觉得更好用一些。就是不知道数据量过大时&#xff0c;效率怎么样&#xff0c;不过既然能用&#xff0…

python数据整理 高一_关于Python爬虫的最全知识梳理,项目经理花了三天总结出来的经验...

作爲零基础小白&#xff0c;大体上可分爲三个阶段去完成&#xff0c;第一阶段是入门&#xff0c;掌握必备基础知识&#xff0c;比如Python基础、网络央求的基本原理等&#xff0c;第二阶段是模仿&#xff0c;跟着别人的爬虫代码学&#xff0c;弄懂每一行代码&#xff0c;熟习主…

GNS3中不同型号路由器支持的模块表

Dynamips 支持的模块C7200 开始Slot 0:C7200-IO-FE <------> 支持1 个Fastethernet 接口C7200-IO-2FE <------> 支持2 个Fastethernet 接口(DynamipsGUI 2.3 里面没有这个选项,想用只有自己添加了)C7200-IO-GE-E <------> 插这个卡以后会同时出现2 个端口,Et…

南京:第三届软博会“外包”将唱主角

南京&#xff1a;第三届软博会“外包”将唱主角 新华网江苏频道2007-08-17 09:10:31 来源: 本网综合 据《江南时报》报道&#xff0c;再过半个月&#xff0c;名列“中国十大知名展会品牌”之一的南京“软博会”——第三届中国&#xff08;南京&#xff09;国际软件产品博览会将…

vue鼠标右键自定义菜单_vue-右键菜单功能

[TOC]>[success] # :-: vue-右键菜单功能[在线demo点击我](https://xunleif2e.github.io/vue-context-menu/demo/dist/#/)项目中有时候会有右键菜单的需求&#xff0c;所以在github找了一个[右键菜单](https://github.com/xunleif2e/vue-context-menu)的插件&#xff0c;使用…

Zookeeper:fsync超时导致实例异常

一、问题描述 2019-02-19 08:44左右&#xff0c;实时计算服务重启&#xff0c;报错显示找不到zk集群的leader节点&#xff0c;同时ZooKeeper集群有告警显示连接超时&#xff1a; 指标[连接耗时(ms)18221]符合告警规则[连接耗时(ms)>3000] 二、排查过程 查看当前集群状态&…

断言(assert)的用法

参考&#xff1a;https://www.runoob.com/w3cnote/c-assert.html 目录作用总结与注意事项Demo作用 assert 是个宏&#xff0c;并且作用并非"报错"。 assert() 的用法像是一种"契约式编程"&#xff0c;程序满足我的假设条件&#xff0c;才能正常良好的运作…

oracle 变量

插入 日期时间 循环插入 declaretotal date: trunc(sysdate-1) ;beginfor i_count in 1..10000 LOOPinsert into DQ_DATE(date_time) values ( total );total : total 1/24;end loop; end; 转载于:https://www.cnblogs.com/kingxiaozi/p/3790327.html

马云语录,非常值得一看(转)

来源:计算机网1999至今 在杭州设立研究开发中心&#xff0c;以香港为总部&#xff0c;创办阿里巴巴网站(Alibaba.com) 孙正义跟我有同一个观点&#xff0c;一个方案是一流的Idea加三流的实施&#xff1b;另外一个方案&#xff0c;一流的实施&#xff0c;三流的Idea&#xff0c;…

keepalived mysql双主架构图_基于keepalived Mysql双主热备配置

基于keepalived双主热备:一.环境:OS:CentOS 6.5 X64DB Version:Percona Mysql 5.7.15-9-log路径:/app/mysql57数据文件路径:/data/mysql57/dataDB1:192.168.213.4DB2:192.168.213.5二.安装keepalived包(两台主机都需操作)1.下载keepalived包cd /usr/local/toolswget http://www…

centos7 docker安装和使用_入门教程

centos7 docker安装和使用_入门教程 原文:centos7 docker安装和使用_入门教程说明&#xff1a;本文也是参考互联网上的文章写的&#xff0c;感谢相关作者的贡献。 操作系统 64位CentOS Linux release 7.2.1511 (Core) 配置好IP&#xff1a;192.168.1.160 修改yum源 目的是提升对…

公钥、私钥、数字签名和数字证书

参考:公钥、私钥、数字签名和数字证书的概念及解密 地址:https://blog.csdn.net/oscar999/article/details/123489420 作者:oscar999 目录 概念解析https 的非对称加密和对称加密如何产生密钥和证书使用keytool 产生公私钥到一个密钥库文件中从密钥库文件导出证书openssl 将…

curl命令具体解释

对于windows用户假设用Cygwin模拟unix环境的话&#xff0c;里面没有带curl命令&#xff0c;要自己装&#xff0c;所以建议用Gow来模拟&#xff0c;它已经自带了curl工具&#xff0c;安装后直接在cmd环境中用curl命令就可&#xff0c;由于路径已经自己主动给你配置好了。 linux …

[转] SQL2000 关于 Java JDBC 驱动的安装和设定

1、首先要记得sql2000 要打上sp3以上的补丁.(建议用sp4)2、装上SQL Server 2000 Driver for JDBC Service Pack 3下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyId07287B11-0502-461A-B138-2AA54BFDC03A&displaylangen3、安装完SQL Server 2000 Driver…

wxpython 可视化开发pdf_MicroPython for the Internet of Things.pdf

标签&#xff1a;MicroPythonMicroPythonPythonPythonIoTiot是Internet Of Things的缩写&#xff0c;字面翻译是“物体组成的因特网”&#xff0c;准确的翻译应该为“物联网”。物联网(Internet Of Things)又称传感网&#xff0c;简要讲就是互联网从人向物的延伸。“物联网”(I…