【问题标题】:pattern for "switching an application feature" e.g. undo/redo“切换应用程序功能”的模式,例如撤销重做
【发布时间】:2012-11-04 03:28:05
【问题描述】:

我喜欢有一种切换功能的模式,在我的情况下是撤消/重做。 我不想要撤消/重做的模式。这工作正常。 但这是跳过撤消/重做所需的代码行的好方法。 使用撤消的示例:

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 标志两次。

【问题讨论】:

    标签: design-patterns undo-redo


    【解决方案1】:

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

    【讨论】:

    • 这对我来说比使用工厂更合理。
    • 有充分的理由同时使用这两种模式:您可以使用工厂来创建您的状态更改对象。第二,装饰器,通过 SwitchOn() 等接口方法启用该功能。
    • 我不明白 AF 的想法。 AF 返回一个对象族。阅读有关小部件和窗口的示例。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2018-09-09
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      相关资源
      最近更新 更多