"Iron"的建造一直沒有停止,現在單個部件是有的,但是在部件從工廠裡出來的時候,在組裝到一起之前,我們還是非常有必要對部件進行質量檢測,或者是其它個方面的檢測,又或者是設置部件標識信息等等,這些操作可以是有序的(也可以是無序的)。
現在為了實現上面的所講的功能來進行演示,然過程中會發現問題,然後解決問題。這裡不多說了直接進入主題。
首先我定義了一個ComponentModel類,它是要被檢驗的對象
Name { ; }
這裡先定義了一個請求處理類型的枚舉,下面要用到,這樣比用什麼字符串或者是數字來作條件判斷要好很多。
}
再然後,我們再來定義檢驗ComponentModel類的類型:
_comModel = (_comModel.Value > _comModel.Name = _comModel = (_comModel.Value > _comModel.Name = }
定義了兩個類型,ConcreteHandlerCaseOne和ConcreteHandlerCaseTwo兩個類型,都是用來處理檢測ComponentModel類型的,現在這些類型都齊全了我們來檢測一下吧。
ComponentModel comModel = ConcreteHandlerCaseOne caseone = ConcreteHandlerCaseTwo casetwo = casetwo.HandleRequest(RequestState.Check);
對的,就是這樣,一次次的檢測下去,如果要檢測20次,並且都是不同的實現,那將非常可怕,代碼冗余,而且請求調用方和處理方的耦合度也很大,那要怎麼樣讓代碼更精簡,並且還能有效的解耦,這裡就要用到職責鏈模式。
為了避免請求的發送者和接收者之間的耦合關系,使多個接受對象都有機會處理請求。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
——Gof
這裡要強調一下的是本篇的示例中並沒有完全遵從設計模式的定義,還是按照本文開始的功能需求來做的設計,當然了模式的核心不變。
現在先對處理方進行抽象:
.Successor = }
既然有了抽象,那就得有具體的實現:
}
這裡的類型應該只定義一個的是為了讓大家看的更明白。
在這裡看抽象處理者Handle類型,它裡面有個protected級別的變量Successor,Successor呢就代表著鏈表中每一環的指針,指向誰呢?當然是指向下一個處理者。
現在來看一下調用的代碼:
ComponentModel comModel = Handle handlerA = Handle handlerB = handlerA.HandleRequest(RequestState.Check, comModel);
看上去已經不錯了,耦合度還是很大的,對於handlerA的調用,還是再調用方直接調用的,這時需要一個中間層,
看一下中間層的定義:
: ( _ComModel = _Handle = _ComModel = (_Handle != _Handle.SetSuccessor(handle); _Handle = }
通過加了一層,再來看一下調用方的代碼:
ComponentModel comModel = CORUnit corunit = corunit.RegisterHandle( corunit.RegisterHandle(
是不是感覺調用方,跟實際的處理方之間的關系變得很弱了,這樣目的也就達到了。