我正在設計一個特定模式的API,但不知道這個模式是否有名稱。它與GoF(四人幫)中的命令模式類似,但不完全相同。在Eclipse中使用IProject.setDescription設計模式
它的一個簡單的例子,我能找到的是Eclipse,你操縱的一個項目(IProject
),而不是通過調用在不改變其狀態的項目的方法,但此3個步驟:
- 將其狀態提取爲描述符對象(
IProjectDescription
),其中getDescription
- 設置描述符的屬性。例如。
setName
- 應用描述符回原來的項目,
setDescription
總的原則似乎是你有一個複雜的對象,與許多潛在的相互依賴性框架的一部分,而不是直接的工作在該對象上,一次只有一個屬性,將屬性提取到一個簡單的數據對象中,對其進行處理並將其應用回來。
它具有Command模式的一些屬性,因爲數據對象封裝了像Command這樣的所有更改 - 但它不是一個真正的命令,因爲它不會在對象上執行執行它,它只是對象狀態的表示。
它也具有Transactional API的一些屬性,因爲通過在set...
調用中一次性完成所有更改,可以讓整個修改有效地「回滾」,如果任何一個屬性更改失敗。但儘管這是該方法的優勢,但它並不是真正的主要目的。而且更重要的是,你可以實現的事務性質沒有這種方法,通過簡單地添加事務方法的API(如commit
和rollback
)
有兩個優點在此模式中,我也想利用 - 雖然我不t看到他們被上面的eclipse示例利用:
您可以在其實現更改時表示底層對象的有意義的狀態。這對於升級或從不同類型的表示複製狀態很有用。假設我發佈了一個新版本的API,其中創建了一個對象Foo2,它是我舊的Foo1的全新形式,但都具有相同的基本屬性。要將Foo1升級到Foo2,我可以將這些屬性提取爲FooState。 foo2.setFooState(foo1.getFooState)就像那樣簡單。解釋和表示屬性的方式封裝在Foos中,可以完全不同。
我可以堅持和傳輸底層對象的狀態與我簡單的數據對象,其中堅持對象本身會更復雜。因此,我可以將Foo的狀態提取爲FooState,並將其作爲一個簡單的XML文檔保存,然後通過「加載」並應用它將其應用於某個新對象。或者我可以將FooState簡單地作爲JSON對象傳遞給Web服務,而Foo本身太大且複雜,無法傳輸。(或服務呼叫兩端的對象是完全不同的,像Foo1和foo2的)
反正,我到處都找不到這種模式的一個名稱或例子,無論是在the Gang of Four design patterns,甚至也不在Martin Fowler的comprehensive "bliki"
,它並不完全適合#1,但會爲它工作。基本上DTO的特性符合我的用例,但是用於通過線傳輸狀態,而不是我的用例,它只是簡單地封裝一個變化。但它仍然是9個月後最接近的答案,因此獲得獎品。 – Rhubarb