责任链模式

责任链模式

对于一个请求,可能有多个处理者,将处理着连接成一个链

如部门里面有一个张三,张三要报销1500元交通费,根据公司规定,1500元属于部门经理审批,所有这个请求应该由部门经理处理

在这里插入图片描述

实现思路

采用链表方式模拟链

具体代码

申请人信息

// 申请人信息
public class Request {
	
	private String name;
	private float price;
	private String desc;
	
	public Request(String name, float price, String desc) {
		super();
		this.name = name;
		this.price = price;
		this.desc = desc;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}

	@Override
	public String toString() {
		return "申请人 [name=" + name + ", price=" + price + ", desc=" + desc + "]";
	}
	
}

审批信息

// 审批信息
public class Result {
	private String appName;
	private String appResult;
	private String appDesc;

	public String getAppName() {
		return appName;
	}

	public void setAppName(String appName) {
		this.appName = appName;
	}

	public String getAppResult() {
		return appResult;
	}

	public void setAppResult(String appResult) {
		this.appResult = appResult;
	}

	public String getAppDesc() {
		return appDesc;
	}

	public void setAppDesc(String appDesc) {
		this.appDesc = appDesc;
	}

	@Override
	public String toString() {
		return "审批结果 [appName=" + appName + ", appResult=" + appResult + ", appDesc=" + appDesc + "]";
	}

	
}

处理链

public abstract class DealChain {
	
	protected DealChain nextChain;
	
	public void setNextChain(DealChain nextChain) {
		this.nextChain = nextChain;
	}
	
	public abstract Result execute(Request request);
}

// 小经理
public class LittleManager extends DealChain {
	@Override
	public Result execute(Request request) {
		float price = request.getPrice();
		if (price <= 1000) {
			Result result = new Result();
			result.setAppName("王华");
			
			// 随机审批一下
			if (new Random().nextBoolean()) {
				result.setAppResult("同意");
			} else {
				result.setAppResult("不同意");
				result.setAppDesc("与事实结果不符。");
			}
			return result;
		}

		// 继续往下高级领导
		return nextChain.execute(request);
	}

}

// 经理
public class Manager extends DealChain {
	@Override
	public Result execute(Request request) {
		float price = request.getPrice();
		if (price <= 5000) {
			Result result = new Result();
			result.setAppName("方世玉");
			
			// 随机审批一下
			if (new Random().nextBoolean()) {
				result.setAppResult("同意");
			} else {
				result.setAppResult("不同意");
				result.setAppDesc("金额出入");
			}
			return result;
		}

		// 继续往下高级领导
		return nextChain.execute(request);
	}

}

// 区域经理
public class RegionManager extends DealChain {
	@Override
	public Result execute(Request request) {
		float price = request.getPrice();
		if (price <= 10000) {
			Result result = new Result();
			result.setAppName("大嘴猴");
			
			// 随机审批一下
			if (new Random().nextBoolean()) {
				result.setAppResult("同意");
			} else {
				result.setAppResult("不同意");
				result.setAppDesc("理由不充分");
			}
			return result;
		}

		// 继续往下高级领导
		return nextChain.execute(request);
	}

}

// 总经理
public class RootManager extends DealChain {
	@Override
	public Result execute(Request request) {
		float price = request.getPrice();
		Result result = new Result();
		result.setAppName("马云");
		if (price <= 100000) {
			result.setAppResult("同意");
		} else {
			result.setAppResult("不同意");
			result.setAppDesc("金额超过100000");
		}
		return result;
	}

}

测试类


public class ChainTest {

	public static void main(String[] args) {

		// 申请人
		Request request = new Request("张三", 1500, "室内交通费!");
		Request request1 = new Request("李四", 5700, "玩耍费!");
		Request request2 = new Request("王五", 15100, "摔倒!");
		Request request3 = new Request("宝强", 150000, "讹钱");
		
		// 审批
		doAction(request);
		doAction(request1);
		doAction(request2);
		doAction(request3);
	}

	// 处理链
	private static void doAction(Request request) {
		DealChain dealChain = ChainBulder.chainBulder();
		Result result = dealChain.execute(request);
		
		print(request, result);
	}

	// 格式化输出
	private static void print(Request request, Result result) {
		System.out.println("=============================================");
		System.out.println(request);
		System.out.println(result);
	}
	
}

ChainBulder

public class ChainBulder {

	public static DealChain chainBulder() {
		DealChain head = new LittleManager();
		DealChain head1 = new Manager();
		DealChain head2 = new RegionManager();
		DealChain head3 = new RootManager();
		
		head.setNextChain(head1);
		head1.setNextChain(head2);
		head2.setNextChain(head3);
		
		return head;
	}
	
}

测试结果

=============================================
申请人 [name=张三, price=1500.0, desc=室内交通费!]
审批结果 [appName=方世玉, appResult=同意, appDesc=null]
=============================================
申请人 [name=李四, price=5700.0, desc=玩耍费!]
审批结果 [appName=大嘴猴, appResult=不同意, appDesc=理由不充分]
=============================================
申请人 [name=王五, price=15100.0, desc=摔倒!]
审批结果 [appName=马云, appResult=同意, appDesc=null]
=============================================
申请人 [name=宝强, price=150000.0, desc=讹钱]
审批结果 [appName=马云, appResult=不同意, appDesc=金额超过100000]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值