职责链模式:将请求的发送者和请求的接收着相分离,用户可以动态的创建职责链,并将请求传入到这条链中,链中的处理类会不断的将该请求向下传递,直到有相关的处理类能够处理它为止。
适用范围:当多给对象处理相同的请求的时候。
这真是个最接地气的模式。
下面是相关实例:
某公司在采购商品的审批流程是采购5万元以下(不包含五万)的商品需要主任进行审批,5万以上10万以下(不包含10万)的商品需要副董事长进行审批,10万以上50万以下(不包含50万)的商品需要董事长审批,50万以上的商品需要董事会开会讨论。
下面使用职责链模式进行设计:
抽象的处理类:Approver
具体的处理类:ZhuRen、FuDongshi、DongShi、DongShiHui
请求类:PurchaseRequest
下面是具体的实现:
//抽象的处理类
public abstract class Approver {
protected Approver approver;
private String name;//审批者的名称
public Approver(String name)
{
this.name = name;
}
//保留下一个处理请求类的引用,以便将请求向下传递
public void setApprover(Approver approver) {
this.approver = approver;
}
public String getName() {
return name;
}
public abstract void requestHandler(PurchaseRequest request);
}
//主任处理
public class ZhuRen extends Approver{
public ZhuRen(String name)
{
super(name);
}
public void requestHandler(PurchaseRequest request) {
if(request.getAmount()<50000)
{
System.out.println(this.getName()+"审批了商品:"+request.getId()+",商品价格:"+request.getAmount()+",商品名称:"+request.getName());
}
//主任不能处理的话将请求传递个下一个处理类
else
{
this.approver.requestHandler(request);
}
}
}
//副董事长处理
public class FuDongShi extends Approver{
public FuDongShi(String name)
{
super(name);
}
public void requestHandler(PurchaseRequest request) {
if(50000<=request.getAmount()&&request.getAmount()<100000)
{
System.out.println(this.getName()+"审批了商品:"+request.getId()+",商品价格:"+request.getAmount()+",商品名称:"+request.getName());
}
//副董事长不能处理的话将请求传递个下一个处理类
else
{
this.approver.requestHandler(request);
}
}
}
//董事长处理
public class DongShiZhang extends Approver{
public DongShiZhang(String name)
{
super(name);
}
public void requestHandler(PurchaseRequest request) {
if(request.getAmount()>=100000&&request.getAmount()<500000)
{
System.out.println(this.getName()+"审批了商品:"+request.getId()+",商品价格:"+request.getAmount()+",商品名称:"+request.getName());
}
//董事长不能处理的话将请求传递个下一个处理类
else
{
this.approver.requestHandler(request);
}
}
}
//董事会处理
public class DongShiHui extends Approver{
public DongShiHui(String name)
{
super(name);
}
public void requestHandler(PurchaseRequest request) {
if(request.getAmount()>=500000)
{
System.out.println(this.getName()+"审批了商品:"+request.getId()+",商品价格:"+request.getAmount()+",商品名称:"+request.getName());
}
//董事会不能处理的话将请求传递个下一个处理类
else
{
this.approver.requestHandler(request);
}
}
}
//需要被处理的请求
public class PurchaseRequest {
private String id;//商品的编号
private String name;//商品的名称
private double amount;//商品的价格
public PurchaseRequest(String id, String name, double amount) {
super();
this.id = id;
this.name = name;
this.amount = amount;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
}
//客户端可以自由的组合职责链
public class Client {
public static void main(String[] args) {
Approverzhuren,fudongshi,dongshizhang,dongshihui;
zhuren = new ZhuRen("主任");
fudongshi = new FuDongShi("副董事长");
dongshizhang = new DongShiZhang("董事长");
dongshihui = new DongShiHui("董事会");
//创建职责链
zhuren.setApprover(fudongshi);
fudongshi.setApprover(dongshizhang);
dongshizhang.setApprover(dongshihui);
//创建请求对象
PurchaseRequest request = new PurchaseRequest("0001", "aaa", 10000);
zhuren.requestHandler(request);
PurchaseRequest request2 = new PurchaseRequest("0002", "bbb", 60000);
zhuren.requestHandler(request2);
PurchaseRequest request3 = new PurchaseRequest("0003", "ccc", 120000);
zhuren.requestHandler(request3);
PurchaseRequest request4 = new PurchaseRequest("0004", "ddd", 1000000);
zhuren.requestHandler(request4);
}
}
结果:
主任审批了商品:0001,商品价格:10000.0,商品名称:aaa
副董事长审批了商品:0002,商品价格:60000.0,商品名称:bbb
董事长审批了商品:0003,商品价格:120000.0,商品名称:ccc
董事会审批了商品:0004,商品价格:1000000.0,商品名称:ddd
职责链模式对客户端隐藏了具体的处理细节,客户端只需要组合职责链并将相应的请求传递给第一个处理类就可以了,具体是哪个类处理的用户是不需要关心的,这样的话也简化了用户的操作。
如果需求改变的时候,加入在主任和副董事长之间添加了经理的话,只需要继承抽象的处理类,并在客户端修改职责链就可以了,有利于系统的扩展,和适应变化的需求。
职责链模式有两类:纯职责链模式和不纯的职责链模式
纯职责链模式:就是请求的对象在职责链中一定会得到处理且只会被一个处理类处理。
不纯的职责链模式:就是请求的对象可能不会被处理或者是可能会被多个处理类处理。