程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#之職責鏈模式

C#之職責鏈模式

編輯:C#入門知識

"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(   

是不是感覺調用方,跟實際的處理方之間的關系變得很弱了,這樣目的也就達到了。

 

         

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved