职责链模式
避免将请求发送者与接受者耦合在一起,让多个对象都有机会接收请求,将这些对象组成连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,是一种对象行为性模式
违背的软件设计原则有
(1)单一职责
(2)开闭原则
(1)Handler(抽象处理者)定义一个处理请求的接口,不同具体处理者处理请求的方式不一样,需要定义一个抽象请求处理办法。因为每个处理者的下级还是处理者,因此还要关联一个抽象处理者类型。
(2)ConcreteHandler(具体处理者)它是抽象处理者的子类,处理用户的请求,实现抽象处理者定义的请求方法,在处理请求之前需要判断自己是否有权限处理,如果有就处理,没有就将请求转发给后继者,具体处理者可以访问链中的下一个对象,用于转发
答:创造每一个职责模块,然后再客户端把关系链拼装在一起。
package com.learn.designmode.mode.chain;
import lombok.Data;
import java.math.BigDecimal;
/** 不演示太多的具体处理类
* 抽象处理类
*/
@Data
public abstract class Approver {
// 定义后继处理
protected Approver approver;
protected String name;
public Approver(String name){
this.name = name;
}
abstract void processReques(PurchaseRequest purchaseRequest);
}
/**
* 具体处理类(主任)
*/
class Director extends Approver{
public Director(String name) {
super(name);
}
@Override
void processReques(PurchaseRequest purchaseRequest){
if (purchaseRequest.getAmount().compareTo(new BigDecimal(5000)) < 0){
System.out.println(this.name + "审批采购单");
}else {
this.approver.processReques(purchaseRequest);
}
}
}
/**
* 具体处理类(董事长)
*/
class President extends Approver{
public President(String name) {
super(name);
}
@Override
void processReques(PurchaseRequest purchaseRequest){
if (purchaseRequest.getAmount().compareTo(new BigDecimal(15000)) < 0){
System.out.println(this.name + "审批采购单");
}else {
this.approver.processReques(purchaseRequest);
}
}
}
/**
* 具体处理类(副董事长)
*/
class VicePresident extends Approver{
public VicePresident(String name) {
super(name);
}
@Override
void processReques(PurchaseRequest purchaseRequest){
if (purchaseRequest.getAmount().compareTo(new BigDecimal(10000)) < 0){
System.out.println(this.name + "审批采购单");
}else {
this.approver.processReques(purchaseRequest);
}
}
}
package com.learn.designmode.mode.chain;
import lombok.Data;
import java.math.BigDecimal;
/**
* 订单
*/
@Data
public class PurchaseRequest {
private BigDecimal amount;
private int number;
private String purpose;
}
package com.learn.designmode.mode.chain;
import java.math.BigDecimal;
public class Client {
public static void main(String[] args) {
Approver approver,approver1,approver2,approver3,approver4;
approver = new Director("主任");
approver1 = new VicePresident("副董事长");
approver2 = new President("董事长");
approver.setApprover(approver1);
approver1.setApprover(approver2);
approver2.setApprover(approver);
// 构件采购单
PurchaseRequest request = new PurchaseRequest();
request.setAmount(new BigDecimal(11000));
request.setPurpose("asd");
request.setNumber(1001);
approver.processReques(request);
}
}
构造职责链的时候不要set副董事长
纯与不纯的职责链模式
纯的职责链模式
纯的职责链模式要求具体处理者只能是两个行为中的一个,要么承担所有责任,要么将责任推给下家,不允许出现某一个具体处理者对象承担了一部分又将责任推给了下家。如前面所述订单处理就是纯的职责链模式。
不纯的职责链模式
跟纯的职责链模式相反,允许一个请求被多个处理者对象处理,并且一个请求可以不被任何处理者处理。
总结
优点
(1)职责链模式使得一个对象无须知道其他哪一个对象处理请求,对象仅需知道该请求会被处理,接受者和发送者都没有明确对方的信息,且链中不需要知道结构,由客户端进行创建。
(2)仅维持一个向后继承的引用,而不需要维持它对所有候选者的引用,简化连接。
(3)给对象分派职责时,可以提供更多的灵活性,可以通过在运行时间对链进行动态的增加或者修改。
(4)符合开闭原则,增加新的具体处理者无需改变原有代码。
缺点
(1)由于一个请求没有明确一个接受者,那么就不能保证它一定会被处理。该请求移一直链的末端都不会被请求。
(2)对于一个长的职责链,对系统的系统将会受到影响,且进行代码调试不太方便。
(3)如果职责链使用不当,会造成死循环。
适用场景
(1)有多个对象可以处理同一个请求,具体哪个对象处理该请求待运行确定,客户端只需将请求提到链上,无须关心处理的对象是谁以及如何处理。
(2)在不明确接受者的情况下,向多个对象中的一个提交一个请求。
(3)可动态指定一组对象处理客户端,客户端可以动态的创建职责链来处理请求。