2011-12-19 40 views
0

我正在製作一個軟件,旨在創建一個像文檔一樣的書。我已經實現了它使用裝飾添加各種功能。這裏是初始化」的一個例子如何爲可配置軟件設置Builder和Decorator模式?

$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i))); 

所面臨的挑戰是,這些裝飾是硬編碼,並且沒有爲sofware的多次迭代的潛力。對新項目所做的有意義的更改通常會回溯到較舊的項目(現在使用裝飾器並不可怕,因爲所需要的只是將另一個裝飾器添加到定義中)。但是,這仍然需要我編輯子類代碼。最佳情況是實際內容創建者選擇他們需要的功能,而不需要程序員編輯任何內容。

顯然,更好的東西在這種情況下,做的是書到用一個對象,實現Builder模式來創建對象的章並在項目的正確裝飾包裹。

最後,我們到達了我的問題是如何才能讓建設者對象動態和正確處理的配置順序?裝飾器包裝的順序意味着解析接口調用的命令(LIFO)。一個例子是文檔編輯跟蹤是作爲裝飾器實現的,但由於顯而易見的原因,應該總是首先評估以在更改之前保存狀態(它應該是最後一個包裝器)。對於將來的開發,假設將會有許多裝飾器,那麼一些可能需要首先解決的裝飾器應該是每個裝飾器具有類似於Builder可能排序的優先數據成員(整數?)的東西?這似乎是一個可行的解決方案,但我擔心如果創建大量優先級敏感的裝飾器/模塊,則實現不會非常健壯。例如,相互衝突的優先級可能需要重新編號許多類。無論如何,我希望人們對此事有任何想法。

的第二個問題是,如果兩個修飾改變相同的特徵以某種方式。如果這種情況甚至是可能的?每個裝飾者是否應指定其域並遍歷尋找衝突的裝飾者列表?

這一切都是假設會有很多裝飾和一些項目的編輯將選擇一些而不是其他。 謝謝!

回答

0

您可以使用修改後的建設者爲此,在您爲構建器方法的每次調用返回不同的器類,並返回生成器類僅有的所有方法的一個子集來構建整個類。

這可以讓你避免多次調用同樣的方法,並且還允許您控制整體構建順序。 可以在這裏找到一個example of this

+0

謝謝,我認爲這是一個開始,但對於我的情況還不太完美。有兩個問題冗餘和秩序。對於建築商,我主要關注訂單。我可以回答關於哪個裝飾器首先解決的問題。最後一個應用然後向內工作。這給了我一個訂單,但是如何讓構建者按照基於數據庫設置的順序來應用它們,而無需訴諸靜態優先級整數。 冗餘是關於裝飾者。當接口調用時,應該允許兩個修飾器編輯相同的功能? – Hath995 2011-12-20 18:24:50

+0

對不起,我想我沒有說清楚。我會重申這個問題。 – Hath995 2011-12-20 18:37:32