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
    }
}

我认为它不优雅的原因:我必须在每个应该支持 Undo/Redo 的函数中使用 booelan 标志两次。

4

2 回答 2

0

为什么不使用装饰器?这样,假设您有一个名为 EditQueue 的东西,您只需将状态更改推入即可。您为此创建一个接口,然后提供两个实现,一个只是 EditQueueImpl,另一个是 UndoEnabledEditQueueImpl。第二个是一个内部有一个 EditQueueImpl 实例的装饰器,这意味着该类的用户不必知道撤消是否打开。

于 2012-11-15T14:57:17.083 回答
0

我认为实现这一点的一个好方法可能是使用带有一些继承的抽象工厂模式。

抽象工厂返回一个具体工厂,它要么构建真正的纪念品对象,要么构建一个虚拟的纪念品。虚拟纪念品显然不做任何事情,并且以与空对象类似的方式工作。

通过这种方式,您将把标志放在一个地方并只使用一次(在抽象工厂中)。我已经使用并且使用了这种方法,我发现它非常优雅和简单(我可能有偏见:)。

不太负面的一点是,您需要在所有方法或类中注入抽象工厂或具体工厂。

于 2012-11-15T14:10:44.387 回答