我正在开发一个WPF应用程序并且我非常了解命令模式,但我发现MVVM的命令模式有几种不同的实现.Josh Smith在他的WPF示例应用程序中实现,DelegateCommand来自Prism,以及CommandBindings实现.
我的问题是,使用MVVM命令的普遍接受的最佳做法是什么?我的应用程序使用Prism,因此DelegateCommand我们可以使用.
我团队的开发人员正在争论哪种方法"最好".有些人不喜欢为每个命令生成的众多.cs文件,有些人更喜欢通过连接所有内容CommandBindings.我不知所措.任何人都能解释一下吗?
允许访问者修改Receiver的状态或者应该是Command模式通常是否可以接受?
是否可以使用Queue of Action代理实现GOF命令模式?
我一直试图绕过它一段时间而且我很难过,因为我想要添加到队列中的每个可能的动作可能有不同数量的参数.
有什么建议?我是否通过专注于命令模式来咆哮错误的树?
更新:
非常感谢jgauffin,这是一种享受...我的实现现在看起来像
public class CommandDispatcher
{
private readonly Dictionary<Type, List<Action<ICommand>>> _registeredCommands =
new Dictionary<Type, List<Action<ICommand>>>();
public void RegisterCommand<T>(Action<ICommand> action) where T : ICommand
{
if (_registeredCommands.ContainsKey(typeof (T)))
_registeredCommands[typeof (T)].Add(action);
else
_registeredCommands.Add(typeof (T), new List<Action<ICommand>> {action});
}
public void Trigger<T>(T command) where T : ICommand
{
if (!_registeredCommands.ContainsKey(typeof(T)))
throw new InvalidOperationException("There are no subscribers for that command");
foreach (var registeredCommand in _registeredCommands[typeof(T)])
{
registeredCommand(command);
if (command.Cancel) break;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用命令模式通过TCP/IP套接字将命令从客户端传递到服务器.服务器将获取命令对象,对其进行反序列化,然后在命令对象上调用execute().但是,我需要通过套接字将值传递回调用方.命令模式是否允许这样做?如果没有,是否有解决方法?我查看了维基百科上的灯光开关示例,这很棒,但没有返回值.任何建议都非常感谢.
在阅读了@RomainGuy 的避免内存泄漏文章后,我意识到我当前的Android应用程序一直困扰着传递应用程序主要活动的错误.所以每当我,我可以简单地用Activity.getApplicationContext()替换该活动参数.
但是我的应用程序中的某些类仍然需要运行只能是应用程序主要活动成员的方法.
因此我想到可能使用命令模式来解决这个限制.
问题是,如果我们看一下这个例子:
public class SomeCommandExecuableOnlyByActivity implements Command
{
public void execute(Object data)
{
doIt( ((MyActivity)data).getWindow() );
}
}
Run Code Online (Sandbox Code Playgroud)
我再次进入需要传递活动的死胡同(这次伪装成Object数据).
如何摆脱这种"鸡蛋和鸡蛋"的局面?
有没有更好的方法来解决这个问题?
android memory-leaks command-pattern java-memory-model android-activity
所以我有一个程序,你可以登录并添加/删除friendsarraylist的朋友.此外,我可以喜欢某件事,那件事会存入likesarraylist.我被要求为我做的任何动作做出撤销和重做选项.
所以我想把苹果添加为朋友.之后,当我选择撤消选项时,我可以撤消该操作,因此苹果不会成为我的朋友.Command Pattern当输入是我输入存储到friendsarraylist中的任何名称或单词时,我如何处理此问题?
我做了一些研究,发现使用命令模式可能是我最好的选择,因为这必须在我已经拥有的Facebook类下完成.我假设我将不得不使用两个不同的堆栈,但我在主题中有点迷失.
我决定添加我所拥有的部分内容,这样我就可以获得更多帮助,了解我需要做什么以及我的程序做了什么.
在驱动程序中
Facebook facebook1 = new Facebook();
if (userInput == 6)
{
System.out.println("Login");
String operand1 = getOperand("What is the Username? ");
String operand2 = getOperand("What is the Password? ");
System.out.println("Enter a friend to be added. ");
String operand3 = getOperand("What is the Username? ");
facebook1.friend(operand3);
}
if (userInput == 7)
{
System.out.println("Login");
String operand1 = getOperand("What is the Username? ");
String operand2 = getOperand("What …Run Code Online (Sandbox Code Playgroud) 从Java核心库问题中的GoF设计模式的例子中可以看出
java.lang.Runnable的所有实现都是Command模式的示例.
根据我对Command模式的理解,
客户端调用Invoker => Invoker调用ConcreteCommand => ConcreteCommand调用Receiver方法,该方法实现抽象的Command方法.
看看这个工作示例
从命令图案UML图本文如下所示.
看看这段代码:
public class ThreadCommand{
public static void main(String args[]){
Thread t = new Thread(new MyRunnable());
t.start();
}
}
class MyRunnable implements Runnable{
public void run(){
System.out.println("Running:"+Thread.currentThread().getName());
}
}
Run Code Online (Sandbox Code Playgroud)
start()方法调用的ConcreteCommand implementaiton(它调用run()方法)Receiver是否在这里失踪?或者MyRunnable是否扮演ConcreteCommand和Receiver的角色?
java multithreading design-patterns command-pattern runnable
出于学习目的,我正在尝试将此 Java 命令模式示例迁移到 PHP:
https://codereview.stackexchange.com/questions/52110/command-pattern-implementation
正如@simon 所评论的那样,使用方法引用运算符,可以使代码现代化很多:
class MyCommand implements Order {
private final Runnable action;
public MyCommand(Runnable action) {
this.action = action;
}
@Override
public void execute() {
action.run();
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以创建这样的命令:
MyCommand bsc = new MyCommand(stock::buy);
MyCommand ssc = new MyCommand(stock::sell);
Run Code Online (Sandbox Code Playgroud)
我当前的 PHP 实现在这里:https : //3v4l.org/iIHn9
那么在 PHP 中实现MyCommand 类的最佳方法是什么?
似乎每当我使用命令模式时,它总是导致比我不使用它时更多的类.这似乎很自然,因为我们在不同的类中一起执行相关代码块.如果我没有完成10或12个Command子类,我可能会认为这个项目本来只会使用6或7个类,否则不会打扰我.对于通常的7级项目,有19个左右的课程似乎差错了.
真正困扰我的另一件事是测试所有这些Command子类是一件痛苦的事.在我接到最后几条命令之后,我感到迟钝,好像我移动速度慢,不再灵活.
这对你来说听起来很熟悉吗?我做错了吗?我只是觉得我在这个项目的后期失去了敏捷,而且我真的不知道如何以前几天的速度不断地实施和测试.
让我们假设我们以这种方式实现了命令模式
我对 Invoker 在这里的作用有点困惑。从我的角度来看:
或者我错过了什么?