2013-02-14 77 views
0

我正在學習設計模式。我不確定如何在C++中實現責任鏈模式。我使用Argo工具從我的圖enter image description here生成我的代碼。責任鏈模式C++

在此圖中,Oracle類是「客戶端」。 Oracle.cpp的構造方法有接下來的行

#include "Oracle.h" 
Oracle::Oracle(){ 
    Validation v;//Here 
} 

這裏我得到了「錯誤:'驗證'沒有在這個範圍內聲明。我的問題:是否有必要創建一個從Oracle到驗證的UML關係「依賴關係」?或者我將如何解決這個錯誤?

+0

您是否將Validation.h添加到Oracle.cpp中? – Deamonpog 2013-02-14 02:57:35

+1

似乎你的問題是關於使用ArgoUML,而不是關於責任鏈模式。也許你應該改變標題。 – Ergwun 2013-02-14 02:57:39

+0

@Deamonpog我不在Oracle中包含Validation.h,因爲它會修改模式Chain of Responsability的UML圖。 – Juan 2013-02-14 02:59:45

回答

1

您的Oracle類不應該具有類型Validation的成員,而應該是類型Handler的成員。

這將在某個地方設置爲驗證(我認爲這將是鏈的第一步)。

現在你還得建立鏈條,鏈條的步驟不應該意識到其他步驟。

現在有兩種選擇,要麼允許Oracle類知道鏈將如何操作,它可以自己構建它(具有所有的依賴關係)。 或者您需要一個構建器類來構建鏈並將其注入Oracle實例(最好通過構造器)。

第二個選項遵循CoR模式的最佳理念(鏈的用戶不知道其內部工作)。

也許ArgoUML添加了驗證的鏈接,以便能夠創建Handler的實例,但這很奇怪。

此外,我相信setNext方法不屬於Oracle類。這個類確實需要引用鏈中的第一個Handler對象,但是最好從構造函數中設置。 如果通過一個setter來設置,你應該給它一個像setHanlderChain這樣的專用名稱來使目的清晰。

成功

在答覆意見:

責任鏈的一個元素沒有對鏈本身的知識,它僅僅是一個參與者。 因此,您需要創建鏈條:實例化參與者並設置他們的下一步。

爲您例如,這可能是這樣的(你要知道它已經因爲我寫了事情的嚴重性在C++中很長一段時間,我認爲在你的類圖的順序執行的順序)

Handler buildOracleChain() 
{ 
    CalculePR step6 = new CalculePR(); 
    step1.setNext(null); 
    SolutionKE step5 = new SolutionKE(); 
    step5.setNext(step6); 
    CalculeSP step4 = new ValcvuleSP(); 
    step4.setNext(step5); 
    KeyGeneration step3 = new KeyGeneration(); 
    step3.setNext(step4); 
    Encrypt step2 = new Encrypt(); 
    step2.setNext(step3); 
    Validation step1 = new Validation(); 
    step1.setNext(step2); 
    return step1; 
} 

對於第二個問題,我沒有真實的例子,但是: 如果將此方法放入構建器類(例如OracleHandlerChainBuilder)中,則只有該類必須導入所有這些步驟,而oracle類只能導入Handler。

在你創建你的Oracle實例的地方,你將它的鏈(在你的情況下用setNext)設置爲構建方法的結果。將實例化Oracle類的類需要導入Oracle類和OracleHandlerChainBuilder類。

這樣,類之間的依賴關係被最小化。

+0

請您解釋一下「或者您需要一個構建器類來構建鏈並將其注入Oracle實例(最好是通過構造函數)。」我是新的使用這種模式。 – Juan 2013-02-14 12:55:48

+0

你有沒有在C++中使用多個文件的這種模式的任何例子? – Juan 2013-02-14 15:44:16