責任鏈模式(chain of responsibility)是一種行爲性模型,行爲型模式關注的是系統中對象之間的相互交互,解決系統在運行時對象之間的相互通信和協作,進一步明確對象的職責。相比來說,創建型模式關注對象的創建過程,結構型模式關注對象和類的組合關係。
模式的職責
將能夠處理同一類請求的對象連城一條鏈,鎖提交的請求沿着鏈傳遞,鏈上的對象諸葛判斷是否有能力處理該請求,如果能則處理,如果不能則傳遞給鏈上的下一個對象。
模式的必要性
如果是上述的要求的話,其實用if,else也是可以完成的,但是爲什麼還有有這個模式呢?因爲這樣的話會有更好的擴展性和更容易處理。
模式的實現
//需要被責任鏈請求處理的對象
public class LeaveRequest {
private String emName;
private int day;
private String reason;
public LeaveRequest(String emName,int day,String reson){
super();
this.emName = emName;
this.day = day;
this.reason = reson;
}
public String getEmName() {
return emName;
}
public void setEmName(String emName) {
this.emName = emName;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
//責任鏈的抽象類
public abstract class Leader {
protected String name;
//下一個責任鏈對象的引用
protected Leader nextLeader;
public Leader(String name){
super();
this.name = name;
}
//下一個責任鏈對象的設定方法
public void setNextLeader(Leader leader){
this.nextLeader = leader;
}
//處理責任鏈請求的核心業務方法。
public abstract void handleRequest(LeaveRequest request);
}
//責任鏈的具體對象
public class Director extends Leader{
public Director(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的邏輯
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
//責任鏈的具體對象
class Manage extends Leader{
public Manage(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的邏輯
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
//責任鏈的具體對象
class GeneralManage extends Leader{
public GeneralManage(String name) {
super(name);
}
@Override
public void handleRequest(LeaveRequest request) {
if(request.getDay()<3){
//批准的邏輯
}else{
if(null != this.nextLeader){
this.nextLeader.handleRequest(request);
}
}
}
}
模式的優勢
其實調用部分處理者的創建以及處理者關係的設定可以通過配置文件來配置完成,而且該代碼的可擴展性非常好,可以隨意添加任何處理對象.
模式的擴展
可以創建一個鏈的對象,裏面存儲鏈表的鏈關係,可以更加方便的調用。