2012-11-15 44 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