設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設(shè)計(jì)模式于己于他人于系統(tǒng)都是多贏的,設(shè)計(jì)模式使代碼編制真正工程化,設(shè)計(jì)模式是軟件工程的基石,如同大廈的一塊塊磚石一樣。項(xiàng)目中合理的運(yùn)用設(shè)計(jì)模式可以完美的解決很多問題,每種模式在現(xiàn)在中都有相應(yīng)的原理來與之對應(yīng),每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的核心解決方案,這也是它能被廣泛應(yīng)用的原因.下面主要說一說責(zé)任鏈模式.
- 責(zé)任鏈模式是一種對象的行為模式.在責(zé)任鏈模式里面,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈.請求在這個(gè)鏈上進(jìn)行傳遞,直到這個(gè)鏈上的某一個(gè)對象來處理請求,發(fā)送這個(gè)請求的客戶端并不知道哪一個(gè)對象最終來處理這個(gè)請求.這使得系統(tǒng)可以在不影響客戶端的情況下來動(dòng)態(tài)的重新組織和分配責(zé)任.
下面說說比較常見的一個(gè)例子,在我們開發(fā)過程中,我們可能為了一個(gè)判斷一個(gè)語句,常常會(huì)寫出大量的if else語句,這使得我們在后期的維護(hù)和開發(fā)上可能會(huì)存在大量的麻煩,每當(dāng)我們增加一個(gè)新的判斷,都需要在原來的代碼上面進(jìn)行修改,這很顯然不符合開閉原則(對修改關(guān)閉,對擴(kuò)展開放).在這種情況下,我們就可以考慮使用責(zé)任鏈模式了.由于只是簡單介紹了一下該模式,所以demo就做的比較簡單了.廢話不多說了,直接上代碼.先看一下目錄結(jié)構(gòu):

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è)務(wù)");
}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è) 務(wù)");
}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)在,當(dāng)我們的type為"廣東"時(shí),前面的type匹配不上的時(shí)候,就會(huì)依次向后傳遞任務(wù),直到有一個(gè)對象可以處理.另外,比如說我們又加了一個(gè)新的需求,河北也需要來處理這個(gè)任務(wù),我們只需要再寫一個(gè)類來繼承AbstractAction它就可以了,里面就是由它來處理自己的邏輯了,對原來的代碼不會(huì)有所改動(dòng),這也就符合了開閉原則,也極大的節(jié)約了我們的開發(fā)時(shí)間.如果還是以前的方式來改動(dòng)的話,有很大的可能會(huì)出錯(cuò),并且大量的if else嵌套看起來也不爽.
好了,本文也只是對責(zé)任鏈模式的一點(diǎn)粗淺的理解,希望能啟到一點(diǎn)拋磚引玉的作用,歡迎各位大神拍磚指正.