设计模式-责任链模式

本文介绍了如何运用责任链模式处理企业中不同金额级别的报销审批流程,通过抽象处理者(领导角色)、具体处理者(班主任、系主任、院长)和客户端角色(测试类)的示例代码,展示了如何简化权限管理和避免if-else结构。
摘要由CSDN通过智能技术生成

背景

  在日常生活中,会有这种场景:当我们要报销费用时,如果金额较小(比如2000),直系领导审批通过就可;当超过2000小于5000时,直系领导就没有权限了,要上报给部门领导审批;当大于5000时,部门领导也批不了了,需要总经理审批。。。这类场景就对应于设计模式中的责任链模式。

角色定义

  抽象处理者角色:一个处理请求的接口,包含一个抽象处理方法和一个后继属性
  具体处理者角色:实现抽象处理者角色定义的接口,处理方法实现为:判断能否处理该请求,能处理就处理,不能处理则转给后继属性
  客户端角色:创建责任链,并向链首的具体处理者对象提交请求

示例代码

	//抽象处理者角色:领导类
	public abstract class Leader {
	
	    private String name;
	
	    public Leader(String name) {
	        this.name = name;
	    }

		public String getName() {
	        return this.name;
	    }
	
	    private Leader next;
	
	    public void setNext(Leader next) {
	        this.next=next;
	    }
	
	    public Leader getNext() {
	        return next;
	    }
	
	    //处理请求的方法
	    public abstract void handleRequest(int LeaveDays);
	
	}
	
	
	/**
	 * 具体处理者角色1:班主任类
	 */
	public class HeadMaster extends Leader {
	
	    public HeadMaster(String name) {
	        super(name);
	    }
	
	    @Override
	    public void handleRequest(int LeaveDays) {
	        if(LeaveDays <= 2)
	        {
	            System.out.println("班主任批准请假" + LeaveDays + "天");
	        }
	        else
	        {
	            if(getNext() != null) {
	                System.out.println("班主任转给上级" + getNext().
	                getName());
	                getNext().handleRequest(LeaveDays);
	            }
	            else {
	                System.out.println("请假天数太多,不予审批!");
	            }
	        }
	    }
	
	}
	
	
	/**
	 * 具体处理者角色2:系主任类
	 */
	public class DepartmentHead extends Leader {
	
	    public DepartmentHead(String name) {
	        super(name);
	    }
	
	    @Override
	    public void handleRequest(int LeaveDays) {
	        if(LeaveDays <= 7)
	        {
	            System.out.println("系主任批准请假" + LeaveDays + "天");
	        }
	        else
	        {
	            if(getNext() != null) {
	                System.out.println("系主任转给上级" + getNext().
	                getName());
	                getNext().handleRequest(LeaveDays);
	            }
	            else {
	                System.out.println("请假天数太多,不予审批!");
	            }
	        }
	    }
	
	}
	
	
	/**
	 * 具体处理者角色3:院长类
	 */
	public class Dean extends Leader {
	
	    public Dean(String name) {
	        super(name);
	    }
	
	    @Override
	    public void handleRequest(int LeaveDays) {
	        if(LeaveDays <= 12)
	        {
	            System.out.println("院长批准请假" + LeaveDays + "天");
	        }
	        else
	        {
	            if(getNext() != null) {
	                System.out.println("院长转给上级" + getNext().
	                getName());
	                getNext().handleRequest(LeaveDays);
	            }
	            else {
	                System.out.println("请假天数太多,不予审批!");
	            }
	        }
	    }
	
	}
	
	
	/**
	 * 客户端角色
	 */
	public class Test {
	
	    public static void main(String[] args) {
	        Leader headMaster = new HeadMaster("班主任");
	        Leader dmHead = new DepartmentHead("系主任");
	        Leader dean = new Dean("院长");
	
	        headMaster.setNext(dmHead);
	        dmHead.setNext(dean);
	
	        headMaster.handleRequest(5);
	        System.out.println("-----");
	        headMaster.handleRequest(8);
	        System.out.println("-----");
	        headMaster.handleRequest(15);
	    }
	
	}

  运行结果:

在这里插入图片描述

优缺点

  优点:
  较好的可扩展性,有需要时可以增加新的请求处理类或者删除某个处理类
  简化了对象之间的连接,每个具体处理者只需要持有一个后继属性,不需要持有其他处理者;同时避免了众多的If-else语句
  降低了耦合度,当责任链更改时,客户端仍然只需给链首的具体处理者发送请求,不做任何改变

  缺点:
  请求不一定能处理掉
  责任链较长时,性能会有一定的影响
  责任链的创建由客户端保证,增加了客户端的复杂性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值