设计模式(20):责任链模式

定义

  • 将能够处理同一请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。

责任链模式角色

  • 抽象处理器(handler): 定义了处理器的处理方法,并维护了下一个处理器对象的引用;
  • 具体处理器(ConcreteHandler): 实现了抽象处理器的处理方法,并确定了当前处理器是否可以处理,如果不能处理,就将请求交给下一个处理器处理;

场景

  • 打牌时,轮流出牌
  • 接力赛跑
  • 大学中,奖学金审批
  • 公司中,公文审批
  • 公司中,请假审批

开发中常见的场景

  • java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch。
  • servlet开发中,过滤器的链式处理。
  • struts2中,拦截器的调用也是经典的责任链模式;

公司里面,请假条的审批流程

  • 如果请假天数小于3天,主任审批;
  • 如果请假天数大于等于3天,小于7天,经理审批;
  • 如果大于等于7天,小于30天,总经理审批;
  • 如果大于30天,提示拒绝。

代码实现

  • 封装请假的基本信息
java 复制代码
/**
 * 封装请假的基本信息
 */
public class LeaveRequest {
	//请假对象
	private String name; 
	//请假多次时间
	private int LeaveDays;
	//请假理由
	private  String reason;	
	public LeaveRequest(String name, int leaveDays, String reason) {
		super();
		this.name = name;
		this.LeaveDays = leaveDays;
		this.reason = reason;
	}
	public String getName() {
		return name;
	}
	public int getLeaveDays() {
		return LeaveDays;
	}
	public String getReason() {
		return reason;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setLeaveDay(int leaveDays) {
		LeaveDays = leaveDays;
	}
	public void setReason(String reason) {
		this.reason = reason;
	}
}
  • 抽象处理器(handler)
java 复制代码
/**
 * 抽象类	责任链对象
 */
public abstract class Leader {
	// 当前责任链对象名称
	protected String name;
	//责任链上的后继对象
	protected Leader nextLeader; 
	public Leader(String name) {
		super();
		this.name=name;
	}
	/**
	 * 设定责任链上的后继对象
	 * @param nextLeader
	 */
	public void setNextLeader(Leader nextLeader) {
		this.nextLeader = nextLeader;
	}
	/**
	 * 处理请求的核心的业务抽象方法
	 * @param request
	 */
	public abstract void HandleReques(LeaveRequest request);
}
  • 具体处理器(ConcreteHandler)
java 复制代码
/**
 * 主任
 */
public class Director extends Leader{
	public Director(String name) {
		super(name);
	}
	@Override
	public void HandleReques(LeaveRequest request) {
		if(request.getLeaveDays()<3){
			System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("主任"+this.name+"给予"+request.getName()+"请假审批通过!");
		}else{
			if(null!=this.nextLeader){
				this.nextLeader.HandleReques(request);
			}
		}
	}	
}
/**
 * 经理
 */
public class Manager extends Leader{
	public Manager(String name) {
		super(name);
	}
	@Override
	public void HandleReques(LeaveRequest request) {
		if(request.getLeaveDays()<7){
			System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("经理"+this.name+"给予"+request.getName()+"请假审批通过!");
		}else{
			if(null!=this.nextLeader){
				this.nextLeader.HandleReques(request);
			}
		}
	}	
}
/**
 * 总经理
 */
public class GeneralManager extends Leader{
	public GeneralManager(String name) {
		super(name);
	}
	@Override
	public void HandleReques(LeaveRequest request) {
		if(request.getLeaveDays()<30){
			System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
			System.out.println("总经理"+this.name+"给予"+request.getName()+"请假审批通过!");
		}else{
			System.out.println("此人可能想辞职,审批不通过!");
		}
	}	
}
  • 客户端组装成链表结构调用
java 复制代码
// 责任链模式 -----不用修改代码  就可以添加相应的子类 
public static void main(String[] args) {
		Leader a=new Director(":张三,");
		Leader b=new Manager(":李四,");
		Leader c=new GeneralManager(":王五,");
		//责任链上的对象关系
		a.setNextLeader(b);
		b.setNextLeader(c);
		
		//开始请假操作
		LeaveRequest req=new LeaveRequest("Tom",8,"相亲");
		a.HandleReques(req);
	}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式(8):组合模式

设计模式(9):外观模式

设计模式(10):享元模式

设计模式(11):适配器模式

设计模式(12):代理模式

设计模式(13):模板方法模式

设计模式(14):命令模式

设计模式(15):迭代器模式

设计模式(16):观察者模式

设计模式(17):中介者模式

设计模式(18):状态模式

设计模式(19):策略模式

设计模式持续更新中...

相关推荐
漂洋过海的鱼儿18 小时前
设计模式——EIT构型(三)
java·网络·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十八)—— 安全模式
人工智能·安全·设计模式
老蒋每日coding1 天前
AI Agent 设计模式系列(十六)—— 资源感知优化设计模式
人工智能·设计模式·langchain
老蒋每日coding1 天前
AI Agent 设计模式系列(十七)—— 推理设计模式
人工智能·设计模式
冷崖1 天前
桥模式-结构型
c++·设计模式
连山齐名1 天前
设计模式之一——堵塞队列
设计模式
会员果汁1 天前
19.设计模式-命令模式
设计模式·命令模式
茶本无香1 天前
设计模式之六—组合模式:构建树形结构的艺术
java·设计模式·组合模式
橘色的喵1 天前
嵌入式 C++ 高性能流式架构的设计
数码相机·设计模式
会员果汁1 天前
20.设计模式-职责链模式
设计模式