2012-11-15 62 views
0

我喜歡有一種切換功能的模式,在我的情況下是撤消/重做。 我不想要撤銷/重做模式。這工作正常。 但是一種跳過撤銷/重做需要的代碼行的好方法。 示例使用撤消:模式例如撤消/重做

AddItemToList(object item) 
{ 
    Memento m = new Memento(..) // create application state object 
    m_list.Add(item); 
    m.AddState("item added", item); // store state change 
    m_Caretaker.Add(m); // store state object 
} 

例如沒有撤銷:

AddItemToList(object item) 
{ 
    m_list.Add(item); 
} 

我想有一個模式比這更優雅:

AddItemToList(object item) 
{ 
    Memento m = null; 
    if(m_UndoEnabled) 
    { 
     m = new Memento(..) // create application state object 
    } 
    m_list.Add(item); 
    if(m_UndoEnabled) 
    { 
     m.AddState("item added", item); // store state change 
     m_Caretaker.Add(m); // store state object 
    } 
} 

原因,我認爲這是不優雅: 我將不得不兩次使用booelan標誌,每個函數應該支持撤消/重做。

回答

0

爲什麼不使用裝飾者?那樣,假設你有一些叫做的東西,例如EditQueue,你只需將狀態更改推入。你爲它做一個接口,然後提供兩個實現,一個簡單的EditQueueImpl和另一個UndoEnabledEditQueueImpl。第二個是裝飾器,裏面有EditQueueImpl的實例,這意味着類的用戶不必知道是否啓用了撤消操作。

+0

這對我來說比使用工廠更合理。 – deafjeff

+0

使用這兩種模式都有很好的理由:可以用來創建狀態更改對象的工廠。第二,通過接口方法(如SwitchOn())啓用該功能的decorater。 – deafjeff

+0

我沒有得到自動對焦的想法。 AF返回一組對象。閱讀有關窗口小部件和窗口的示例。 – Rob

0

我認爲一個很好的實現方法可能是使用具有繼承性的抽象工廠模式。

抽象工廠返回一個具體的工廠,要麼建立真正的紀念品對象或虛擬紀念品。虛擬紀念品顯然沒有做任何事情,並且以與空對象類似的方式工作。

通過這種方式,您將在一個地方使用該標誌並且只使用一次(在抽象工廠中)。我用過,我用這種方法,我覺得它非常優雅和簡單(我可能會有偏見:)。

不那麼負面的一點是,您需要在所有方法或類中注入抽象工廠或混凝土工廠。

+0

謝謝,請參閱下面我的評論。 – deafjeff