簡體   English   中英

哪種設計模式/ RTTI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM