[英]Which Design Pattern / RTTI
我正在尋找將對象分派到正確的“目標”對象的最佳方法。
我有一個基本的命令類:Cmd,兩個子類: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);
我想使用Visitor模式,因為我希望能夠做一些大致的事情:
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;
}
}
}
謝謝
聽起來更像是您想要適當命名的Command模式 。
關鍵是將accept()
的不同參數移到從Cmd
派生的每個類的構造函數中。 例如, GotoLineCommand
的構造函數會將行和緩沖區對象作為其構造函數的參數,並將存儲指向緩沖區對象的指針或引用。
完成此操作后,就不再需要參數accept()
並且從Cmd
派生的所有類的接口都相同
class Buffer
{
public:
void gotoLine(int line);
};
class Cmd
{
public:
virtual void accept() = 0;
};
class GotoLineCommand: public Cmd
{
public:
GotoLineCommand(Buffer & buffer, int line) :
buffer_(buffer),
line_(line)
{
}
virtual void accept()
{
buffer_.gotoLine(line_);
}
private:
Buffer & buffer_;
int line_;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.