我正在學習設計模式。我不確定如何在C++中實現責任鏈模式。我使用Argo工具從我的圖生成我的代碼。責任鏈模式C++
在此圖中,Oracle類是「客戶端」。 Oracle.cpp的構造方法有接下來的行
#include "Oracle.h"
Oracle::Oracle(){
Validation v;//Here
}
這裏我得到了「錯誤:'驗證'沒有在這個範圍內聲明。我的問題:是否有必要創建一個從Oracle到驗證的UML關係「依賴關係」?或者我將如何解決這個錯誤?
我正在學習設計模式。我不確定如何在C++中實現責任鏈模式。我使用Argo工具從我的圖生成我的代碼。責任鏈模式C++
在此圖中,Oracle類是「客戶端」。 Oracle.cpp的構造方法有接下來的行
#include "Oracle.h"
Oracle::Oracle(){
Validation v;//Here
}
這裏我得到了「錯誤:'驗證'沒有在這個範圍內聲明。我的問題:是否有必要創建一個從Oracle到驗證的UML關係「依賴關係」?或者我將如何解決這個錯誤?
您的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類。
這樣,類之間的依賴關係被最小化。
您是否將Validation.h添加到Oracle.cpp中? – Deamonpog 2013-02-14 02:57:35
似乎你的問題是關於使用ArgoUML,而不是關於責任鏈模式。也許你應該改變標題。 – Ergwun 2013-02-14 02:57:39
@Deamonpog我不在Oracle中包含Validation.h,因爲它會修改模式Chain of Responsability的UML圖。 – Juan 2013-02-14 02:59:45