我正在与包括工具栏按钮,菜单项和击键都启动相同的底层代码的基本UI一个WinForm .NET应用程序。 现在对于这些事件处理程序调用执行功能的常用方法。
从我读过这是什么类型的动作可以由处理命令设计模式与自动启用/禁用或选中/取消选中的UI元素的额外好处。
我一直在寻找的净一个很好的例子项目,但真的还没有找到一个。 有没有人有可共享的一个很好的例子?
我正在与包括工具栏按钮,菜单项和击键都启动相同的底层代码的基本UI一个WinForm .NET应用程序。 现在对于这些事件处理程序调用执行功能的常用方法。
从我读过这是什么类型的动作可以由处理命令设计模式与自动启用/禁用或选中/取消选中的UI元素的额外好处。
我一直在寻找的净一个很好的例子项目,但真的还没有找到一个。 有没有人有可共享的一个很好的例子?
让我们先确保我们知道Command模式是什么:
命令模式封装的请求作为一个对象,并赋予它一个已知的公共接口。 命令模式确保每个对象接收其自己的命令,并提供发送器和接收器之间的去耦。 发送者是调用的操作的对象,并且接收器是接收该请求并作用于它的对象。
下面是一个例子。 有很多方法可以做到这一点,但我要带一个接口基地的做法使代码为你更多的测试。 我不知道你喜欢什么语言,但我在C#写的。
首先,创建一个描述命令的接口。
public interface ICommand
{
void Execute();
}
其次,创建将执行命令interface命令对象。
public class CutCommand : ICommand
{
public void Execute()
{
// Put code you like to execute when the CutCommand.Execute method is called.
}
}
第三,我们需要设置我们的调用或发送对象。
public class TextOperations
{
public void Invoke(ICommand command)
{
command.Execute();
}
}
四,创建将使用调用/发送对象的客户对象。
public class Client
{
static void Main()
{
TextOperations textOperations = new TextOperations();
textOperation.Invoke(new CutCommand());
}
}
我希望你可以把这个例子并投入使用了您正在使用的应用程序。 如果您想了解更多的澄清,只是让我知道。
你在正确的轨道上。 基本上你将有表示文档的模型。 您将在CutCommand使用此模式。 您将要改变CutCommand的构造函数接受要剪切的信息。 然后每次,说剪切按钮被点击时,你调用一个新的CutCommand并传递参数的构造函数。 然后使用这些参数在上课的时候调用Execute方法。
尝试开源,.NET编辑器一样的SharpDevelop或者记事本++ 。
有(自然)在命令模式的一些讨论http://c2.com/cgi/wiki?CommandPattern可能会有所帮助。
Qt使用的菜单栏/工具栏项命令模式。
QActions从QMenuItem和在QToolBar seperately创建,并且操作可以被分配给QMenuItem和在QToolBar分别的setAction()和的addAction()方法。
http://web.archive.org/web/20100801023349/http://cartan.cas.suffolk.edu/oopdocbook/html/menus.html
http://web.archive.org/web/20100729211835/http://cartan.cas.suffolk.edu/oopdocbook/html/actions.html
我不能帮你例如链接,但可以通过自己提供的例子。
1)定义ICommand接口:
public interface ICommand {
void Do();
void Undo();
}
2)做你的ICommand实现混凝土的命令,同时也定义抽象基类,它们:
public abstract class WinFormCommand : ICommand {
}
3)创建命令调用器:
public interface ICommandInvoker {
void Invoke(ICommand command);
void ReDo();
void UnDo();
}
public interface ICommandDirector {
void Enable(ICommand);
void Disable(ICommand);
}
public class WinFormsCommandInvoker : ICommandInvoker, ICommandDirector {
private readonly Dictionary<ICommand, bool> _commands;
private readonly Queue<ICommand> _commandsQueue;
private readonly IButtonDirector _buttonDirector;
// you can define additional queue for support of ReDo operation
public WinFormsCommandInvoker(ICommandsBuilder builder, IButtonDirector buttonDirector) {
_commands = builder.Build();
_buttonDirector = buttonDirector;
_commandsQueue = new Queue<ICommand>();
}
public void Invoke(ICommand command) {
command.Do();
__commandsQueue.Enqueue(command);
}
public void ReDo() {
//you can implement this using additional queue
}
public void UnDo() {
var command = __commandsQueue.Dequeue();
command.Undo();
}
public void Enable(ICommand command) {
_commands.[command] = true;
_buttonDirector.Enable(command);
}
public void Disable(ICommand command) {
_commands.[command] = false;
_buttonDirector.Disable(command);
}
}
4)现在,你可以实现你的ICommandsBuilder,IButtonDirector并添加其他接口如ICheckBoxDirector到WinFormsCommandInvoker。