最近專案中的乙個需求就是對於一串資料,通過一系列的判斷條件來判斷其是不是符合要求的。這個判斷條件是不斷變化的。也就是說隨時要增加新的判斷條件或者移除舊的判斷條件,也行我們會覺得寫一大串if…else if ….不就解決了嗎?當然,if….else if可以解決問題,但軟體有乙個重要的原則:開閉原則。
什麼是開閉原則:
在物件導向程式設計領域中,開閉原則規定」軟體中的物件(類,模組,函式等等)應該對於擴充套件是開放的,但是對於修改是封閉的」。試想,如果判斷條件不斷的增加,難道要不斷的去增加efse if嗎?如果有上百的判斷條件是不是要寫上百個else..if..這樣**臃腫,給後期維護帶來巨大的困難。
責任鏈模式:
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有乙個物件處理它為止。
適用場景:
第一次接觸責任鏈模式的時候是在研究struts2的時候,當時便驚嘆與它巧妙的設計,可以講乙個龐大的處理流程完成的這麼優雅。現在我們來用責任鏈模式完成上述的要求:執行判斷的抽象類
public
abstract
class abstractjudgment
public string getcontent()
public
void
setnextjudg(abstractjudgment nextjudg)
//獲取判斷結果
public
abstract boolean getresult();
}
現在我們寫三個具體的執行判斷的例項:
public
class
judgmentone
extends
abstractjudgment
@override
public boolean getresult()
}public
class
judgmenttwo
extends
abstractjudgment
@override
public boolean getresult()
}public
class
judgmentthree
extends
abstractjudgment
@override
public boolean getresult()
}
現在我們就有了三個判斷條件,我們來寫乙個handler:
//抽象處理者類,
public
abstract
class abstracthandler else else}}
// 定義鏈中每個處理者具體的處理方式
protected
abstract boolean handle(abstractjudgment request);
}
現在定義它的實現類:
public
class
judgehandler
extends
abstracthandler
}
完成,測試:
@test
public
void
testlinked()
ok 一天乙個設計模式 責任鏈模式
為了避免請求傳送者與多個請求處理者耦合在一起,將所有請求的處理者通過前一物件記住其下乙個物件的引用而連成一條鏈 當有請求發生時,可將請求沿著這條鏈傳遞,直到有物件處理它為止。責任鏈模式主要包含以下角色。抽象處理者 handler 角色 定義乙個處理請求的介面,包含抽象處理方法和乙個後繼連線。具體處理...
乙個請假案例弄懂責任鏈模式
1 什麼是責任鏈模式?定義 將能夠處理同一類請求的物件連成一條鏈,所提交的請求沿著鏈傳遞,鏈上的物件逐個判斷是否有能力處理該請求,如果能處理則處理,如果不能則傳遞給鏈上的下乙個物件。2 應用場景?場景 打牌時輪流出牌 接力賽跑 大學中,獎學金審批 公司中公文審批 3 uml類圖描述,以生活當中我們請...
設計模式學習之 把物件串成乙個鏈(責任鏈模式)
責任鏈模式就是使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。責任鏈模式重點是在鏈上,鏈上的節點都有可能處理請求,前提是必須是符合處理該節點處理條件,如果不符合將繼續查詢下乙個節點,而處理功能通常會採用遞迴...