博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重学设计模式(七)—— 责任链模式
阅读量:4224 次
发布时间:2019-05-26

本文共 2064 字,大约阅读时间需要 6 分钟。

笔者最近在研究SpringMVC的请求处理过程,发现请求拦截器的处理过程就是责任链模式的很好体现,一环扣一环,异常就退出,无需后继处理。

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

责任链模式的类图:

这里写图片描述

工作中申请费用时一般根据金额大小会有不同的审批人选,比如小于1000元只需项目经理同意即可,3000元以下需要部门经理同意,超过3000元的需要总经理同意,那我们通过使用责任链模式实现此例子。

public abstract class Handler {    private Handler successor;    public Handler getSuccessor() {        return successor;    }    public void setSuccessor(Handler successor){        this.successor = successor;    }    public abstract String handleRequest();}
public class ProjectManager extends Handler{
public String handleRequest(int amount) { System.out.println("当前处理人:项目经理"); if(amount < 1000){ return "审批通过"; }else { System.out.println("金额超限,已流转至部门经理"); return getSuccessor().handleRequest(amount); } }}
public class DeptManager extends Handler{
public String handleRequest(int amount) { System.out.println("当前处理人:部门经理"); if(amount < 3000){ return "审批通过"; }else { System.out.println("金额超限,已流转至总经理"); return getSuccessor().handleRequest(amount); } }}
public class GeneralManager extends Handler{
public String handleRequest(int amount) { System.out.println("当前处理人:总经理"); return "审批通过"; }}

我们来测试一下当我们需要申请不同的费用时的逻辑是否正确。

public class ResponsibilityChainTest {    public static void main(String[] args) {        Handler projectManager = new ProjectManager();        Handler deptManager = new DeptManager();        Handler generalManager = new GeneralManager();        projectManager.setSuccessor(deptManager);        deptManager.setSuccessor(generalManager);        System.out.println(projectManager.handleRequest(500));        System.out.println("==========================\n");        System.out.println(projectManager.handleRequest(1500));        System.out.println("==========================\n");        System.out.println(projectManager.handleRequest(3500));    }}

运行结果:

这里写图片描述

你可能感兴趣的文章
Effective C++条款16:成对使用new和delete时要采取相同形式
查看>>
sizeof与strlen
查看>>
一个递归+二分法的洗牌程序
查看>>
YUV格式注释
查看>>
一维、二维数组传参
查看>>
判断当前时间的下一秒是多少
查看>>
从文本文件中读取数据排序并输出到文本
查看>>
求一个整数数组中第二大的数
查看>>
删除一个链表中的节点
查看>>
计算机网络面试整理【转】
查看>>
编译过程的五个阶段
查看>>
Linux系统中的fork()函数详解
查看>>
TCP/IP总结
查看>>
WireShark使用教程
查看>>
UDP总结
查看>>
为什么不能建立引用数组?
查看>>
Union的一个知识点
查看>>
基类析构函数为虚函数的研究
查看>>
函数入栈出栈以及栈帧
查看>>
从RTTI谈C++的向下转型
查看>>