JAVA职责链模式

JAVA职责链模式

通过本文将学习到

Table of Contents

前言

1、职责链模式的概念

2、职责链的UML图

3、职责链的实现

4、指责链的优缺点

5、职责链的使用场景

6、总结


前言

今天写了个小脚本,感觉还挺有意思的!写程序就是要写点自己觉得好玩的东西么。不然,写出来都没有一点成就感。还有今天庆祝WJ小姐姐可以溜了,还是挺好的。业务小姐姐教了我很多!接下来的日子不会这么轻松了。再有今天看了一部电影闪灵,这部电影最大得感受就是想要让人灭亡得先让他疯狂!

话不多说,职责链是一个行为型得设计模式在系统中如果存在多个对象可以处理一个客户端请求时,可以将相关的对象连成一条链来经行对请求的处理,其中一家如果能处理则直接处理否则交由给下一家。

1、职责链模式的概念

职责链模式:避免将一个请求的发送者和请求的处理者耦合在一起,让多个对象都有处理请求的机会。将接受请求的对象连成一条线链并且沿着这条链传递请求,直到有一个对象能够处理它为止。

在我得工作中,就有这种类似的例子。比如工作流,当我进行一个单据的提交,首先我要交给我得业务部组长审批,然后是部门经理,然后是财务经理。然后财务经理就批准成功给我发钱。在这个过程中我只需要将我的请求发送给我的部门组长,然后由它帮我进行审批,和传递。而我就只要等待最后的结果。

简单来说,职责链模式就是将发送请求者,和请求接受者进行了解耦。我(请求发送者)不必,自己将每一个给请求发送给请求接受者们(我得各个上级).

2、职责链的UML图

JAVA职责链模式_第1张图片

 

1、Handle()、抽象处理类在类中定义了一个success的属性,抽象的处理方法。success是对下家的引用,因为不同的接受对象处理方法不同所以用抽象方法设计处理方法。通过对下个处理对象的引用行出了一条链。

2、ConcreteHandle(),具体的处理类,通过继承或实现抽象处理类,并且实现的对应的请求方法。当请求发送到具体的处理类时,首先进行判断是否自己能够处理该请求,如果可以则执行处理方法,否则将该请求转发给下一个具体处理类。形成一条链!

3、职责链的实现

来一个例子:假如我是一个采购员要买一批货,我要提交申请单。但是我得金额是有限制的,比如。1W部门领导批,10w副董事批,10W-30W董事批,30W-50W董事会批。就是实现一个这样的审批链。

PurchaseRequest:审批单类,做请求类。

package chainOfResponsibility;
/**
 * 
* 

Title: PurchaseRequest

*

Description:采购申请单(请求类)

* @author HAND_WEILI * @date 2018年9月13日 */ public class PurchaseRequest { private String purpose; //采购目的 private int number; //采购单号 private double amount; //采购总价 public PurchaseRequest(String a,int b,double c) { this.purpose=a; this.number=b; this.amount=c; } public String getPurpose() { return purpose; } public void setPurpose(String purpose) { this.purpose = purpose; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } }

 Approver 抽象审批类():设计的核心类。处理请求和跳转请求。

package chainOfResponsibility;
/**
 * 
* 

Title: Approver

*

Description:审批抽象类

* @author HAND_WEILI * @date 2018年9月13日 */ public abstract class Approver { protected Approver success; //定义下一个处理对象 protected String name ; //定义下一个对象的名字 public Approver(String name) { this.name=name; } //创建链 public void setApprover(Approver approver) { this.success=approver; } public abstract void handlePurchaseRequest(PurchaseRequest purchaseRequest) ; }

 主任类:第一个审批节点。我自己设置的。

package chainOfResponsibility;
/**
 * 
* 

Title: Director

*

Description:主任类

* @author HAND_WEILI * @date 2018年9月13日 */ public class Director extends Approver{ public Director(String name) { super(name); } @Override public void handlePurchaseRequest(PurchaseRequest purchaseRequest) { if(purchaseRequest.getAmount()<10000) { System.out.println("主任"+this.name+"审批了采购单"+purchaseRequest.getNumber()+"金额"+purchaseRequest.getAmount()+"用于"+purchaseRequest.getPurpose()); }else { //将传递给下一个 this.success.handlePurchaseRequest(purchaseRequest); } } }

副董事:第二个审批节点 

package chainOfResponsibility;
/**
 * 
* 

Title: VicePresident

*

Description:副董事类第二个审批的对象

* @author HAND_WEILI * @date 2018年9月13日 */ public class VicePresident extends Approver { public VicePresident(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void handlePurchaseRequest(PurchaseRequest purchaseRequest) { if(purchaseRequest.getAmount()<50000) { System.out.println("副董事"+this.name+"审批了采购单"+purchaseRequest.getNumber()+"金额"+purchaseRequest.getAmount()+"用于"+purchaseRequest.getPurpose()); }else { //将传递给下一个 this.success.handlePurchaseRequest(purchaseRequest); } } }

 董事类:第三个审批节点

package chainOfResponsibility;
/**
 * 
* 

Title: President

*

Description:董事进行审批

* @author HAND_WEILI * @date 2018年9月13日 */ public class President extends Approver{ public President(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void handlePurchaseRequest(PurchaseRequest purchaseRequest) { // TODO Auto-generated method stub if(purchaseRequest.getAmount()<100000) { System.out.println("董事"+this.name+"审批了采购单"+purchaseRequest.getNumber()+"金额"+purchaseRequest.getAmount()+"用于"+purchaseRequest.getPurpose()); }else { //将传递给下一个 this.success.handlePurchaseRequest(purchaseRequest); } } }

董事会:最后一个节点 

package chainOfResponsibility;

public class Congress extends Approver{

	public Congress(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void handlePurchaseRequest(PurchaseRequest purchaseRequest) {
		// TODO Auto-generated method stub
		System.out.println("董事会"+this.name+"审批了采购单"+purchaseRequest.getNumber()+"金额"+purchaseRequest.getAmount()+"用于"+purchaseRequest.getPurpose());
	}

}

 Client:测试类,记住审批链的节点都是自己进行设置的,并不是被用审批者来创建的。

package chainOfResponsibility;

public class Client {
	public static void main(String[] args) {
		Approver a1,a2,a3,a4;
		a1 = new Director("LW");
		a2 = new VicePresident("LWQ");
		a3 = new President("小木木");
		a4 = new Congress("海贼王");
		//创建审批链
		a1.setApprover(a2);
		a2.setApprover(a3);
		a3.setApprover(a4);
		//创建单据
		PurchaseRequest p1 = new PurchaseRequest("购买倚天剑",10001,9999);
	
		a1.handlePurchaseRequest(p1);
		p1 = new PurchaseRequest("购买屠龙刀",10002,49999);
		a1.handlePurchaseRequest(p1);
		p1 = new PurchaseRequest("购买葵花宝典",10003,99999);
		a1.handlePurchaseRequest(p1);
		p1 = new PurchaseRequest("购买桃花岛",10004,91239999);
		a1.handlePurchaseRequest(p1);
	}

}

 

JAVA职责链模式_第2张图片

4、指责链的优缺点

优点;

  1. 职责链模式使得一个对象无需知道是哪一个对象处理其请求,对象仅需要知道该请求会被处理即可,降低了系统的耦合度。
  2. 请求处理对象仅需要位置一个指向其后继者的引用。
  3. 再给对象分派职责时,职责链可以更多的灵活性。

缺点:

  1. 由于一个请求没有明确的接受者,那么就比呢能够保证它一定被处理,该请求可能到最后的末端也不会被处理啦。
  2. 对于比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一个定的影响。
  3. 如果建链不当,可能会导致循环调用。陷入死循环。

5、职责链的使用场景

  • 有多个对象处理同一个请求。
  • 在不明确接收者的情况下对多个接收者发出请求。
  • 可动态的指定一组对象为接收者,自己创建审批的人。

 

 

 

你可能感兴趣的:(技术总结学习,设计模式)