0

機能を切り替えるためのパターンが好きです。私の場合は、元に戻る/やり直しです。Undo/Redoのパターンは必要ありません。これは正常に機能しています。ただし、Undo/Redoに必要なコード行をスキップするための良い方法です。undoを使用した例:

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

エレガントではないと思う理由:元に戻る/やり直しをサポートする各関数で、ブーエランフラグを2回使用する必要があります。

4

2 に答える 2

0

これを実装する良い方法は、いくつかの継承を伴う抽象ファクトリパターンを使用することかもしれないと思います。

抽象ファクトリは、実際のメモリオブジェクトまたはダミーのメモリを構築する具象ファクトリを返します。ダミーメモリは明らかに何もせず、nullオブジェクトと同じように機能します。

このようにして、フラグを1つの場所に配置し、それを1回だけ使用します(抽象ファクトリで)。私はこれまで使用してきましたが、このアプローチを使用していますが、非常にエレガントでシンプルだと思います(偏見があるかもしれません:)。

それほど否定的な点は、すべてのメソッドまたはクラスに抽象ファクトリまたは具象ファクトリのいずれかを注入する必要があるということです。

于 2012-11-15T14:10:44.387 に答える
0

デコレータを使ってみませんか?このように、たとえばEditQueueと呼ばれるものがあり、状態の変化をプッシュするだけであるとします。そのためのインターフェースを作成してから、2つの実装を提供します。1つは単にEditQueueImplで、もう1つはUndoEnabledEditQueueImplです。2つ目は、EditQueueImplのインスタンスを内部に持つデコレータであり、クラスのユーザーは、undoがオンになっているかどうかについて何も知る必要がないことを意味します。

于 2012-11-15T14:57:17.083 に答える