こんにちは、現在書いているアプリケーションに新しい機能を追加しようとしています。元に戻す/やり直し機能を書く必要があります。しかし、私たちのアプリケーションの 90% は準備ができており、既に作成されたコードに影響を与えずにこの機能を実装する最良の方法は何なのかわかりません。
8416 次
3 に答える
8
Reed Copseyが言うように、do/redo を実装するための最も一般的なパターンはCommand Patternです。基本的な考え方は、次のようなインターフェイスを実装するコマンドとしてアクションを実装することです。
public interface ICommand { public void Execute(); public void Undo(); }
次に、すべてのコマンドをまとめて実行するクラス (Control) があります。このようなクラスは、コマンドのグループで構成する必要があります。コマンドを実行すると、各コマンドは (push()
メソッドによって)スタック内にプッシュされます。アクションを元に戻したい場合は、スタックからすべての要素を取得し (を使用して)、そのメソッドpop()
を実行します。Undo()
public class Control {
private ArrayList<ICommand> commands = new ArrayList<ICommand>();
private Stack<ICommand> stack = new Stack<ICommand>();
public Control() {
commands.add(new Command1());
commands.add(new Command2());
commands.add(new Command3());
}
public void Execute() {
for(int index=0; index<=command.size(); index++) { command.Execute(); stack.push(command);}
}
public void Undo()
{
while (!stack.empty()) {
ICommand command = (ICommand)stack.pop();
if (command != null) { command.Undo(); }
}
}
}
注: これは非常に単純なコードであり、コマンド パターンの背後にあるアイデアを明確にするためのものです。
于 2010-10-20T00:28:58.780 に答える
8
ここには詳細はあまりありません。ただし、元に戻す/やり直し機能は通常、Command Patternのいくつかのバリエーションを介して処理されます。アーキテクチャによっては、これは基本機能を「コマンド」に単純に作り直すか、大幅なオーバーホールになる可能性があります。
于 2010-10-19T23:21:08.847 に答える