理解
一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。注意:”请求”,”链”,”处理者”。
术语
图片摘自:hehonghui的github
分析这个类图:
Handler—抽象处理者
1.拥有一个void handlerRequest()方法。
2.并且自身包含自己的一个对象(自聚合)。ConcreteHandler—具体处理者
1.拥有一个handleRequest方法。
2.Handler类依赖于ConcreteHandler类,因Handler是一个抽象的。
3.且ConcreteHandler继承于Handler。
案例和思路
还是用出差这个例子来说,小白出差找领导申请差旅费,不同的领导能审批不同的额度(官越大审批钱越多)。
1.角色为员工小白和4个领导,由于领导较多(责任分离)所以可抽象为一个Leader类出来,然后具体实现3个不同级别的Leader(小组长,财务总监,大Boss),由于本场景就一个员工,所以员工类我就不抽象了。
操作:先创建了4个类:(Leader,BossLeader,MoneyLeader,TeamLeader),Leader就是抽象处理者Handler,而其余3个类则是具体处理者ConcreteHandler。然后再创建一个员工类Emploee。类创建好了,接下来我们分析逻辑如何写。
2.Leader有一个方法handleMoney(money)
,这不用多想,领导就干这事的。然后就是”领导”之间的上级下级”关系”,这也是责任链中的”链”的体现,即一个请求具备在链条上具备多个被处理的节点或是可能性,那么我们再定义一个方法setNextLeader(Leader)
,意为在本次请求不在当前领导的责任范围内时,”下家处理者”是谁,一般就是”领导的领导”。
代码
这里我就贴下Leader和测试(Client)类,其他代码我已提到github了。
github地址
Leader.java
package com.zj.dp.责任链模式;
public abstract class Leader {
private String name;//领导名字
private Leader nextLeader;//链的体现,下家领导
private int handelArea;//审批额度区间
public Leader(int handelArea, String name) {
this.handelArea = handelArea;
this.name = name;
}
void handleMoney(int money) {
if (money > handelArea) {
if (null != nextLeader) {
nextLeader.handleMoney(money);
return;
} else {
if (getName() != null && getName().equals("boss")) {
System.out.println("已经超过大Boss的审批额度");
} else {
System.out.println(getName() + "的下家领导为空");
}
}
} else {
System.out.println("小子,你申请的钱" + money + "由我" + name + "批下来了");
}
}
void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ClientTest.java
package com.zj.dp.责任链模式;
public class ClientTest {
public static void main(String[] args) {
//员工初始化
Employee xiaoMing = new Employee("小明");
//领导初始化
BossLeader bossLeader = new BossLeader(50000, "boss");
MoneyLeader moneyLeader = new MoneyLeader(10000, "moneyLeader");
GroupLeader groupLeader = new GroupLeader(1000, "groupLeader");
groupLeader.setNextLeader(moneyLeader);
moneyLeader.setNextLeader(bossLeader);
//发起员工请求
xiaoMing.requestMoney(15000, groupLeader);
xiaoMing.requestMoney(1500, moneyLeader);
xiaoMing.requestMoney(150, groupLeader);
}
}
输出结果
小明_向_groupLeader_提出了申请_15000
小子,你申请的钱15000由我boss批下来了
小明_向_moneyLeader_提出了申请_1500
小子,你申请的钱1500由我moneyLeader批下来了
小明_向_groupLeader_提出了申请_150
小子,你申请的钱150由我groupLeader批下来了