职责链模式---利用enum实现

职责链模式

职责链模式:程序员以多种不同的方式来解决问题,然后将他们链接在一起。当一个请求来临时,她遍历这个链,直到链中的某个解决方法能够处理该请求。

结合网上的这篇关于职责链的博客,我觉得非常好,案例是关于公司员工请假的流程 ,请求—>项目经理审批---->HR审批—>总经理审批。由于 原文是用C#来实现的,我按照原文的观点,使用java语言和enum实现了一下。请先移步至此,不然你可能不知道我在说什么… https://www.cnblogs.com/langtianya/p/4060941.html

/**
 * @Author zhouzixiang
 * @Date 2018年8月12日 下午2:04:38
 * 请求类 :封装员工的请假理由 请假天数
 */
public class Request {
	private float day;
	private String resaon;
	
	public Request(float day, String resaon) {
		this.day = day;
		this.resaon = resaon;
	}

	public float getDay() {
		return day;
	}

	public void setDay(float day) {
		this.day = day;
	}

	public String getResaon() {
		return resaon;
	}

	public void setResaon(String resaon) {
		this.resaon = resaon;
	}

}

package 枚举.我的职责链;

import java.util.Random;

/** 
* @author zhouzixinag
* @version 创建时间:2018年8月12日 下午2:06:18 
* 类说明 
* 枚举类 封装了 项目经理、人力资源HR、 总经理 三种角色。
*/
public enum Handler {
	//项目经理
	ProjectManager{
		boolean PassRequest(Request request){
			if (getSuccessor() ==null ) {
				Successor = HR; //default 默认为HR;
			}
			System.out.println("项目经理开始审批...");
			if (request.getDay()<=0.5) {
				System.out.println("项目经理审批通过");
				return true;
			}
			System.out.println("项目经理递交审批至"+Successor);
			return Successor.PassRequest(request);
		}
	},
	//HR
	HR{
		boolean PassRequest(Request request){
			if (getSuccessor() == null) {
				Successor = Manager; //default 默认为总经理;
			}
		System.out.println("人力资源HR开始审批...");
		if (request.getDay()>0.5 && request.getDay()<=2) {
			System.out.println("人力资源HR审批通过");
			return true;
		}
		System.out.println("人力资源HR递交审批至"+Successor);
		return Successor.PassRequest(request);
	}
	},
	
	Manager{
		boolean PassRequest(Request request){
			Successor = null; //default 正常情况下没有下一处理者;
			System.out.println("总经理开始审批...");
			Random rand = new Random();
			int nextInt = rand.nextInt(2);
			if (nextInt==1) {
				System.out.println("总经理审批通过");
				return true;
			}else {
				System.out.println("总经理驳回了请假请求");
				return false;
			}
			
		}
	};
	//下一个处理者
	public Handler Successor ;
	//获取下一个处理着
	public Handler getSuccessor() {
		return Successor;
	}
	//设置下一个处理着
	public void setSuccessor(Handler successor) {
		Successor = successor;
	}
	/*抽象方法,具体审批过程 有enum各自去实现*/
	abstract boolean PassRequest(Request request);
	
	public static void main(String[] args) {
		Request request = new Request(0, "病假");
		Request request2 = new Request(0.6f, "病假");//这里如果大于0.5天,会有异常,由于业务逻辑的关系,项目经理会和HR之间相互“踢皮球”。
		//Handler handler = ProjectManager;//请求从头开始,也就是项目经理开始
		Handler handler = HR;//请求也可以从中间开始 ,加入项目经理不在,直接从人力资源HR开始审核。
		handler.setSuccessor(ProjectManager);
		System.out.println(handler.PassRequest(request));
		System.out.println(handler.PassRequest(request2));
	}
}

运行结果:
运行结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值