2013-01-15 29 views
5

我正在設計一個特定模式的API,但不知道這個模式是否有名稱。它與GoF(四人幫)中的命令模式類似,但不完全相同。在Eclipse中使用IProject.setDescription設計模式

它的一個簡單的例子,我能找到的是Eclipse,你操縱的一個項目(IProject),而不是通過調用在不改變其狀態的項目的方法,但此3個步驟:

  1. 將其狀態提取爲描述符對象(IProjectDescription),其中getDescription
  2. 設置描述符的屬性。例如。 setName
  3. 應用描述符回原來的項目,setDescription

總的原則似乎是你有一個複雜的對象,與許多潛在的相互依賴性框架的一部分,而不是直接的工作在該對象上,一次只有一個屬性,將屬性提取到一個簡單的數據對象中,對其進行處理並將其應用回來。

它具有Command模式的一些屬性,因爲數據對象封裝了像Command這樣的所有更改 - 但它不是一個真正的命令,因爲它不會在對象上執行執行它,它只是對象狀態的表示。

它也具有Transactional API的一些屬性,因爲通過在set...調用中一次性完成所有更改,可以讓整個修改有效地「回滾」,如果任何一個屬性更改失敗。但儘管這是該方法的優勢,但它並不是真正的主要目的。而且更重要的是,你可以實現的事務性質沒有這種方法,通過簡單地添加事務方法的API(如commitrollback

有兩個優點在此模式中,我也想利用 - 雖然我不t看到他們被上面的eclipse示例利用:

  1. 您可以在其實現更改時表示底層對象的有意義的狀態。這對於升級或從不同類型的表示複製狀態很有用。假設我發佈了一個新版本的API,其中創建了一個對象Foo2,它是我舊的Foo1的全新形式,但都具有相同的基本屬性。要將Foo1升級到Foo2,我可以將這些屬性提取爲FooState。 foo2.setFooState(foo1.getFooState)就像那樣簡單。解釋和表示屬性的方式封裝在Foos中,可以完全不同。

  2. 我可以堅持和傳輸底層對象的狀態與我簡單的數據對象,其中堅持對象本身會更復雜。因此,我可以將Foo的狀態提取爲FooState,並將其作爲一個簡單的XML文檔保存,然後通過「加載」並應用它將其應用於某個新對象。或者我可以將FooState簡單地作爲JSON對象傳遞給Web服務,而Foo本身太大且複雜,無法傳輸。(或服務呼叫兩端的對象是完全不同的,像Foo1和foo2的)

反正,我到處都找不到這種模式的一個名稱或例子,無論是在the Gang of Four design patterns,甚至也不在Martin Fowler的comprehensive "bliki"

回答

3

Data Transfer Object(DTO),馬丁·福勒介紹他的書Principles of Enterprise Application Architecture似乎是爲你點描述2.

DTO的是,它代表了更復雜的領域模型的一個相當簡單的提取的目的。

Fowler描述了DTO與彙編程序結合使用可用於保持DTO獨立於它應該表示的實際域對象(或對象)。彙編程序知道如何從域對象創建DTO,反之亦然。他還提到DTO需要可序列化來持續/傳輸其狀態。您在第2點中描述的內容似乎與此描述相符。

你在第1點中描述的雖然看起來並不是預期的目的,但使用這種模式絕對看起來是可以實現的。

我不確定你是否瀏覽了他的書或書本身的模式目錄。本書更詳細地描述了這一點。

您可能還想看看Oracle的Transfer Object定義,福勒說他的描述爲here就是DTO。

+0

,它並不完全適合#1,但會爲它工作。基本上DTO的特性符合我的用例,但是用於通過線傳輸狀態,而不是我的用例,它只是簡單地封裝一個變化。但它仍然是9個月後最接近的答案,因此獲得獎品。 – Rhubarb

2

並非所有的設計都被記錄爲一個設計模式,實際上大多數系統設計是多個模式的組合。

然而,你正在做的一部分,與IProjectDescription使用Memento,但你的似乎是一個多態的變化。考慮模式,因爲它們出現在模式目錄中,而不是最終結果的基本出發點。那裏的模式本來就應該延伸和結合起來。

Command pattern可以給你提交和回滾(做/撤消),並以這種方式與它結合是一種非常普遍的方法。在Java Servlet API中使用HttpRequest & HttpResponse可以看到同樣的結果。

+0

嗯,我明白你來自哪裏,但這不是那種模式。調用者從API(「創建者」)獲取一個對象,並在稍後將其發回,但這就是它的相似之處。這個交易斷言是:「紀念物件本身是一個不透明的物件(看守者不能或不應該改變)」,而在我的模式中,獲取物件的整個目的是修改它,然後用它來像你說的那樣更新「原創者」 – Rhubarb