2009-11-17 60 views
3

我有一個窗口,它可以像Visual Studio設計器一樣工作。每個文件有兩種觀點:如何設計具有不同偵聽器的命令模式?

  • 源視圖,
  • 設計者的查看。

我有一個工具欄,可以發出不同的命令。工具欄按鈕有一個CommandId字符串屬性,用於存儲命令的Id,例如:

  • 剪切,複製,粘貼;
  • 插入網格,
  • 自動套用格式
  • ...

我無法設計命令模式,其中取決於視圖命令的執行是不同的。

對於一個明顯的例子,在複製命令將在源視圖時複製選定的文本,但在設計者的查看時將複製選定的控制。

我目前映射commandId字符串到CopyCommand對象,但由於命令的執行取決於看法是不同的,我不知道應如何實施。

  • 如若每個視圖供給它理解(並且因此具有兩個CopyCommandSourceCopyCommandDesignCopyCommand共享相同的id)混凝土命令的列表?

  • 或者應該每個命令都是唯一的,但視圖有一個大的映射函數,根據命令ID改變行爲?

回答

2

結合使用Strategy PatternState Pattern。使每個窗口實現一個接口,該接口定義可發送給它的常用命令 - 例如, IWindowEditCommands。對於多平面窗口,使用內部策略對象來封裝每個可能窗口狀態的通用命令的不同實現。狀態模式在您切換窗口狀態時進入 - 例如。設計視圖和源視圖。當窗口改變狀態時,它適當地改變存儲在commandState中的對象的類型,確保正確的具體策略用於實現剪切,複製和粘貼。要將它連接到菜單命令對象,只需使用菜單命令查找當前選定的窗口並向其發送適當的消息即可。

public interface IWindowEditCommands 
{ 
    string Copy(); 
    string Cut(); 
    void Paste(string buffer); 
} 

public class Editor implements IWindowEditCommands 
{ 
    private IWindowEditCommands commandState; 

    //constructor and other methods 

    public void SwitchToSourceView() 
    { 
     //do stuff 
     commandState = new EditorSourceViewStrategy(this); 
    } 

    public void SwitchToDesignView() 
    { 
     //do stuff 
     commandState = new EditorDesignViewStrategy(this); 
    } 

    //IWindowEditCommands methods 
    public string Copy() { return commandState.Copy(); } 
    public string Cut() { return commandState.Cut(); } 

    public void Paste(string buffer) { commandState.paste(buffer); } 

} 

public class EditorSourceViewStrategy implements IWindowEditCommands 
{ 
    private Editor editor; 

    public EditorSourceViewEditCommands(Editor editor) 
    { 
     this.editor = editor; 
    } 

    public string Copy() {return...} //return the selected source from the source view 
    public string Cut() {return...} //return the and delete the selected source from the source view 
    public void Paste(String buffer) {} //insert the buffer text at the insertion point 
} 

public class EditorDesignViewStrategy implements IWindowEditCommands 
{ 
    private Editor editor; 

    public EditorDesignViewEditCommands(Editor editor) 
    { 
     this.editor = editor; 
    } 

    public string Copy() {return...} //return the selected TAGS from the source view 
    public string Cut() {return...} //return the and delete the selected TAGS from the source view 
    public void Paste(String buffer) {} //insert the buffer text at the insertion point 
} 
0

如果在ICommandContext中傳遞(如接收方請參閱「設計模式」第234頁)。您的每個視圖都會實現此界面,然後掌握如何執行命令的知識。命令對象的唯一責任是封裝動作,以便您可以從菜單調用CopyCommand,從鍵盤「Ctrl + C」,使用右鍵單擊副本,也可以使用其他方法...

public interface ICommandContext 
{ 
void Cut(); 
void Copy(); 
void Past(); 
void AutoFormat(); 
} 

public SourceView : ICommandContext 
{ 
    public void Cut() 
    { 
     // Do stuff here... 
    } 
} 

public class CopyCommand : Command 
{ 
    public override Execute(ICommandContext context) 
    { 
     context.Copy(); 
    } 
} 

定義(自dofactory):

封裝的請求爲對象, 從而讓你參數 客戶不同的要求,隊列 或登錄請求,並支持可撤銷的 操作。

+0

呃,我想我沒有那麼做。我在工作中受限制的互聯網訪問上責怪它。 (希望老闆看到這個評論) – 2009-11-18 01:28:19

相關問題