設計模式(Design pattern)是一套被反復使用痰娱、多數(shù)人知曉的牍疏、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結冻押。使用設計模式是為了可重用代碼驰贷、讓代碼更容易被他人理解、保證代碼可靠性翼雀。 毫無疑問饱苟,設計模式于己于他人于系統(tǒng)都是多贏的孩擂,設計模式使代碼編制真正工程化狼渊,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項目中合理的運用設計模式可以完美的解決很多問題狈邑,每種模式在現(xiàn)在中都有相應的原理來與之對應城须,每一個模式描述了一個在我們周圍不斷重復發(fā)生的問題,以及該問題的核心解決方案米苹,這也是它能被廣泛應用的原因.下面主要說一說責任鏈模式.
- 責任鏈模式是一種對象的行為模式.在責任鏈模式里面,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈.請求在這個鏈上進行傳遞,直到這個鏈上的某一個對象來處理請求,發(fā)送這個請求的客戶端并不知道哪一個對象最終來處理這個請求.這使得系統(tǒng)可以在不影響客戶端的情況下來動態(tài)的重新組織和分配責任.
下面說說比較常見的一個例子,在我們開發(fā)過程中,我們可能為了一個判斷一個語句,常常會寫出大量的if else語句,這使得我們在后期的維護和開發(fā)上可能會存在大量的麻煩,每當我們增加一個新的判斷,都需要在原來的代碼上面進行修改,這很顯然不符合開閉原則(對修改關閉,對擴展開放).在這種情況下,我們就可以考慮使用責任鏈模式
了.由于只是簡單介紹了一下該模式,所以demo就做的比較簡單了.廢話不多說了,直接上代碼.先看一下目錄結構:
AbstractAction.java
package com.rain.design.abliti;
public abstract class AbstractAction implements Action{
public Action action;
@Override
public void todo(String type) {
System.out.println("我是總部,你們處理不了就給我處理!!");
}
public Action getAction() {
return action;
}
public void setAction(Action action) {
this.action = action;
}
}
Action.java
package com.rain.design.abliti;
public interface Action {
void todo(String type);
}
Guangdong.java
package com.rain.design.abliti;
public class Guangdong extends AbstractAction{
private static final String type="廣東";
@Override
public void todo(String type) {
if(this.type.equals(type)){
System.out.println("我是廣東處理中心,我只處理廣東的業(yè)務");
}else{
Action action = this.getAction();
if (action != null) {
action.todo(type);
}else{
super.todo(type);
}
}
}
}
Hubei.java
package com.rain.design.abliti;
public class Hubei extends AbstractAction{
private static final String type="湖北";
@Override
public void todo(String type) {
if(this.type.equals(type)){
System.out.println("我是湖北處理中心,我只處理湖北的業(yè) 務");
}else{
Action action = this.getAction();
if (action != null) {
action.todo(type);
}else{
super.todo(type);
}
}
}
}
Test.java
package com.rain.design.abliti;
public class Test {
public static void main(String[] args) {
String type = "廣東";
Hunan hunan = new Hunan();
Hubei hubei = new Hubei();
Jiangxi jiangxi = new Jiangxi();
Guangdong guangdong = new Guangdong();
hunan.setAction(hubei);
hubei.setAction(jiangxi);
jiangxi.setAction(guangdong);
guangdong.setAction(null);
hunan.todo(type);
}
}
下面的就不貼了,都是類似的了.現(xiàn)在,當我們的type
為"廣東"時,前面的type
匹配不上的時候,就會依次向后傳遞任務,直到有一個對象可以處理.另外,比如說我們又加了一個新的需求,河北也需要來處理這個任務,我們只需要再寫一個類來繼承AbstractAction
它就可以了,里面就是由它來處理自己的邏輯了,對原來的代碼不會有所改動,這也就符合了開閉原則,也極大的節(jié)約了我們的開發(fā)時間.如果還是以前的方式來改動的話,有很大的可能會出錯,并且大量的if else
嵌套看起來也不爽.
好了,本文也只是對責任鏈模式的一點粗淺的理解,希望能啟到一點拋磚引玉的作用,歡迎各位大神拍磚指正.