gpt4 book ai didi

c# - 如何设计具有不同监听器的命令模式?

转载 作者:行者123 更新时间:2023-11-30 17:23:53 24 4
gpt4 key购买 nike

我有一个像 Visual Studio 设计器一样工作的窗口。每个文档都有两个 View :

  • 源 View ,
  • 设计器 View 。

我有一个可以发出不同命令的工具栏。工具栏按钮有一个 CommandId 字符串属性,用于存储命令的 Id,例如:

  • 剪切、复制、粘贴;
  • 插入网格,
  • 自动格式化
  • ...

我在设计命令模式时遇到问题,其中命令的执行因 View 而异。

举一个明显的例子,复制命令将在源代码 View 中复制选定的文本,但在设计器 View 中将复制选定的控件.

我目前正在将 commandId 字符串映射到 CopyCommand 对象,但是由于命令的执行因 View 而异,我不确定这应该如何实现。

  • 每个 View 是否应该提供它理解的具体命令列表(因此有两个 CopyCommand,如 SourceCopyCommandDesignCopyCommand共享相同的 ID)?

  • 或者每个命令都应该是唯一的,但是 View 具有很大的映射功能,可以根据命令 id 更改行为?

最佳答案

使用 Strategy Pattern 的组合和 State Pattern .使每个窗口实现一个接口(interface),该接口(interface)定义可以发送给它的通用命令 - 例如。 IWindowEditCommands。对于多面板窗口,使用内部策略对象来封装每个可能的窗口状态下常用命令的不同实现。当您在窗口状态之间切换时会出现状态模式 - 例如。设计 View 和源代码 View 。当窗口改变状态时,它会适本地改变存储在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
}

关于c# - 如何设计具有不同监听器的命令模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1751773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com