模式簡介
責任鏈模式是一種對象的行爲模式.在責任鏈模式裏面,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈.請求在這個鏈上進行傳遞,直到這個鏈上的某一個對象來處理請求,發送這個請求的客戶端並不知道哪一個對象最終來處理這個請求.這使得系統可以在不影響客戶端的情況下來動態的重新組織和分配責任.
案例(申請加薪和請假)
模擬日常公司請假和申請調薪流程,有經理、cto、boss三個角色的管理人員
Request.java
package com.codetears.ChainOfResponsibility;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Request {
/** 請求類型(1:請假 2:加薪)*/
private int type;
/** 請假天數/加薪金額*/
private BigDecimal amount;
}
Manager.java
package com.codetears.ChainOfResponsibility;
import lombok.Data;
/**
* 管理者
*/
@Data
abstract class Manager {
protected String name;
protected Manager supManager;
abstract public void deal(Request request);
}
CommonManager.java
package com.codetears.ChainOfResponsibility;
import java.math.BigDecimal;
/**
* 經理
*/
public class CommonManager extends Manager {
public CommonManager(Manager supManager, String name) {
super.name = name;
super.supManager = supManager;
}
@Override
public void deal(Request request) {
int type = request.getType();
BigDecimal amount = request.getAmount();
switch (type) {
case 1:
if (amount.compareTo(new BigDecimal("3")) > 0) {
supManager.deal(request);
} else {
System.out.printf(this.name + "批准");
}
break;
case 2:
if (amount.compareTo(new BigDecimal("5000")) > 0) {
supManager.deal(request);
} else {
System.out.printf(this.name + "批准");
}
}
}
}
CtoManager.java
package com.codetears.ChainOfResponsibility;
import java.math.BigDecimal;
/**
* 經理
*/
public class CtoManager extends Manager {
public CtoManager(Manager supManager, String name) {
super.name = name;
super.supManager = supManager;
}
@Override
public void deal(Request request) {
int type = request.getType();
BigDecimal amount = request.getAmount();
switch (type) {
case 1:
if (amount.compareTo(new BigDecimal("10")) > 0) {
supManager.deal(request);
} else {
System.out.printf(this.name + "批准");
}
break;
case 2:
if (amount.compareTo(new BigDecimal("8000")) > 0) {
supManager.deal(request);
} else {
System.out.printf(this.name + "批准");
}
}
}
}
BossManager.java
package com.codetears.ChainOfResponsibility;
import java.math.BigDecimal;
/**
* 經理
*/
public class BossManager extends Manager {
public BossManager(String name) {
super.name = name;
}
@Override
public void deal(Request request) {
int type = request.getType();
BigDecimal amount = request.getAmount();
switch (type) {
case 1:
if (amount.compareTo(new BigDecimal("20")) > 0) {
System.out.printf(this.name + "拒絕申請");
} else {
System.out.printf(this.name + "批准");
}
break;
case 2:
if (amount.compareTo(new BigDecimal("10000")) > 0) {
System.out.printf(this.name + "拒絕申請");
} else {
System.out.printf(this.name + "批准");
}
}
}
}
Client.java
package com.codetears.ChainOfResponsibility;
import java.math.BigDecimal;
public class Client {
public static void main(String[] args) {
Manager bossManager = new BossManager("王老闆");
Manager ctoManager = new CtoManager(bossManager, "趙總監");
Manager commonManager = new CommonManager(ctoManager,"張經理");
// Request request = new Request();
// request.setType(1);
// request.setAmount(new BigDecimal("115"));
//
// commonManager.deal(request);
Request request1 = new Request();
request1.setType(2);
request1.setAmount(new BigDecimal("9500"));
commonManager.deal(request1);
}
}