/**
* 行为模式之责任链模式
* 当责任连上的当前节点不能处理当前任务时,交给自己的下一节点处理。自己处不理了就交给别人处理
* 和成绩的分类一样,可以用if else语句实现,但是服务改变是维护待机较大。
*责任链的优点:责任链上的节点可以动态添加或删除。责任链可以写在客户端。
*日常中的责任链,一个异常可以多个catch捕获,典型的责任链模式
*/
public class ChainOfResponsility {
public static void main(String[] args) {
//创建处理任务对象
Request res = new Request("张三","回家",10);
//创建责任链节点
Leader a = new Director("老王");
Leader b = new Manager("老zhang");
Leader c = new GeneralManager("老li ");
//连接责任链
a.setNextLeader(b);
b.setNextLeader(c);
//任务处理
a.handleResquest(res);
}
}
//下面以请假为例:请假天数小于3天主任处理,小于10天经理处理,小于30天总经理处理
/*
* 责任链处理的任务
*/
class Request{
private String empName;
private String reason;
private int leaveDays;
public Request(String empName, String reason, int leaveDays) {
super();
this.empName = empName;
this.reason = reason;
this.leaveDays = leaveDays;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
}
/**
* 责任链节点抽象类
*/
abstract class Leader{
protected String name;
protected Leader nextLeader;
public Leader(String name) {
super();
this.name = name;
}
public void handleResquest() {
// TODO Auto-generated method stub
}
//设置下一个节点
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
//责任处理
public abstract void handleResquest(Request res) ;
}
/**
* 主任
*/
class Director extends Leader{
public Director(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void handleResquest(Request res) {
if(res.getLeaveDays()<3) {
System.out.println("主任批准");
}
else if(nextLeader!=null) {
nextLeader.handleResquest(res);
}
}
}
/**
* 经理
*/
class Manager extends Leader{
public Manager(String name) {
super(name);
}
@Override
public void handleResquest(Request res) {
if(res.getLeaveDays()<10) {
System.out.println("经理批准");
}else if(nextLeader!= null) {
nextLeader.handleResquest(res);
}
}
}
/**
* 总经理
*/
class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
public void handleResquest(Request res) {
if(res.getLeaveDays()<30) {
System.out.println("总经理批准");
}
else {
System.out.println("请假天数大于30天开出员工");
}
}
}