オブジェクトを正しい「ターゲット」オブジェクトにディスパッチする最良の方法を探しています。
基本コマンド クラス: Cmd、2 つのサブクラス: BufferCmd と StateCmd があります。コマンド「GotoLine」は BufferCmd から派生し、「ChangeCmd」は StateCmd から派生します。BufferCmds は Buffer クラスに移動するためのものであり、StateCmds は State オブジェクトに移動するためのものです。
現在、次のようなことができるように訪問者パターンを設定しています。
Buffer buffer;
State state;
Cmd *c;
GotoLineCmd gotoCmd = new GotoLineCmd (15);
ChangeCmd changeCmd = new ChangeCommand (...)
c = &gotoCmd;
c->accept (buffer);
c = &changeCmd;
c->accept (state);
おおよそ次のようなことができるようにしたいので、訪問者パターンを使用したいと思います。
Cmd *cmds [5];
cmds [0] = new GotoLineCmd (...);
cmds [1] = new CopyLineCmd (...);
cmds [2] = new PasteCmd (...);
foreach (Cmd *c in cmds) {
c->accept (buffer);
}
残念ながら、これを使用するには、コマンドを送信するオブジェクトを知る必要があります。私はこのようなことをしたいと思います:
Derive Buffer from Commandable
Derive State from Commandable
Commandables *commandables [1] = {new Buffer (), new State () };
// Then have the foreach type statement look like:
foreach (Cmd *c in cmds) {
c->accept (commandables);
}
このような状況に最も適したパターンはありますか? 訪問者パターンを使用する必要がありますか? 明らかに私はこれを避けたい:
foreach (Cmd *c in cmds) {
foreach (Commandable *cmdAbles in commandables) {
if (c->accept (commandables)) {
// Okay command accepted...
break;
}
}
}
ありがとう