2010-12-10 24 views
0

我想在C++中使用複合設計模式,以便能夠創建和操作一組對象。我遇到的一個問題是,因爲樹葉和複合材料的處理方式是相同的,並且複合材料可能由樹葉和複合材料組成,所以在向複合材料發出命令時,對象可能會多次運行。使用複合設計模式對不同類型的對象進行操作,是否有辦法防止對象被多次操作?

例如,複合組1包含對象A和B.然後,創建一個複合組2,其中包含複合組1和對象A.當複合組2被操作時,對象A將被操作兩次。對於某些應用程序,我猜這不是問題,但對於我的使用,如果對於發佈到組合的任何命令,唯一對象只能運行一次,我會喜歡它。

有沒有一種慣用的方法來處理這個問題,或者是一些如何防止多次調用對象的成員函數,或者阻止一個對象被多次包含在一個組合中?

-

更新: 通過「慣用的」我的意思是處理這類問題的「傳統」或「接受」的方式。 我想我只是假設/希望這是一個常見的問題,有一個確定的解決方案。

+0

你的問題是對象A有兩個'父母',你想在這裏做什麼?爲什麼這個對象分成兩組?如果必須這樣做,那麼應用操作的標準思路就不會按照您的預期工作。您必須以某種方式記錄您執行「此操作」的對象,並且只在對象上執行,如果沒有。 – 2010-12-10 12:01:39

+0

我想要實現的是不僅從單個對象創建組的靈活性,而且還從對象和現有組的任意組合創建組 - 基本上,複合模式的用途就在於,能夠將葉子和複合材料同樣處理通過組件接口? – zebraman 2010-12-10 17:20:42

回答

1

我不知道你是什麼意思的慣用,但一個解決方案將取決於如何遍歷複合材料的結構。這裏有一些選擇

  • 如果你使用一個訪問者和記已經訪問組件,忽略重複
  • 使用滴答計數和具有複合元素在兩忽略具有相同刻度計數連續調用
  • 一步法收集所有需要在一組中操作的複合對象,然後在兩步法中執行您的操作
  • 在您的複合對象中設置一個標誌,表示這一輪被觸摸的時間,清除標誌之前下一輪
+0

謝謝,我想我會嘗試標記方法。但是,想知道的是,這種類型的問題(不想多次調用對象的成員函數)通常不與Composite模式相關聯?我覺得它必須是。還是通常用於應用程序的複合模式無關緊要?如果我想確保每個對象只有一個函數調用,是否有更好的設計模式? – zebraman 2010-12-10 17:24:41