簡體   English   中英

責任鏈模式C ++

[英]Chain of responsibility pattern C++

我正在研究設計模式。 我不確定如何在C ++中實現責任鏈模式。 我正在使用Argo工具從圖表生成代碼 在此處輸入圖片說明

在此圖中,Oracle類是“客戶端”。 Oracle.cpp構造函數方法具有以下幾行

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

在這里,我得到“錯誤:在此范圍內未聲明'Validation'”。 我的問題:是否有必要創建從Oracle到Validation的UML關系“依賴關系”? 或者我將如何解決該錯誤?

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

當然,這將在某個地方設置為“驗證”(我認為這將是鏈的第一步)。

現在您仍然必須構建鏈,鏈的步驟應該不知道其他步驟。

現在有兩個選擇,要么允許Oracle類知道鏈將如何運行,要么可以自己構建鏈(帶有所有依賴項)。 或者,您需要一個構建器類來構建鏈並將其注入到Oracle實例中(最好是通過構造器)。

第二種選擇最好地遵循CoR模式的原理(鏈的用戶不知道其內部工作)。

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

此外,我相信setNext方法不屬於Oracle類。 此類確實需要引用鏈中的第一個Handler對象,但這最好從構造函數中進行設置。 如果通過設置器設置,則應給它一個適當的名稱,例如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)設置為build方法的結果。 實例化Oracle類的類需要同時導入Oracle類和OracleHandlerChainBuilder類。

這樣,可以最大程度地減少類之間的依賴關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM